- 博客(91)
- 收藏
- 关注
原创 OC中循环引用和@weakify和@strongify
Objective C 的 Block 是一个很实用的语法,特别是与GCD结合使用,可以很方便地实现并发、异步任务。但是,如果使用不当,Block 也会引起一些循环引用问题(retain cycle)—— Block 会 retain ‘self’,而 ‘self‘ 又 retain 了 Block。
2024-12-30 18:22:40
361
原创 sort函数在什么情况下可以使用
sort() 函数受到底层实现方式的限制,它仅适用于普通数组和部分类型的容器。在运用sort函数前,需要引用库<algorithm>,即在开头加上。
2024-10-11 21:41:48
295
原创 指针和迭代器的区别
本质是封装了原生指针,是指针概念的一种提升,提供了比指针更高级的行为,相当于一种智能指针,它可以根据不同的数据结构来实现不同的++,–等操作;迭代器是一种高级别的、抽象的数据访问接口,它隐藏了容器内部数据的具体实现细节,提供了一种统一的方式来遍历容器中的元素。指针的使用可能导致一些常见的错误,如空指针访问、越界访问等。迭代器通常提供了更多的安全保证,例如在边界检查、空容器检查等方面做了更多的工作,从而降低了出错的可能性。,表现的像指针,实际上他只是模拟了指针的一些功能,通过重载指针的一些操作符:->、
2024-10-11 21:10:03
334
原创 const是怎么实现的?
因为结构体类型不是内置数据类型,编译器不知道如何直接替换,因此必须要访问内存去取数据,而访问内存去取数据必然会取到被指针q改变后的值,因此会造成与C++中const int类型完全不一样的处理模式。问题2,C++语言中 const struct test的元素j通过指针q被改变了,为何const int 与 const struct test的反应机制不同?而在C++中,通过指针p修改了值后,i仍然是10。,当通过指针p改变该内存中的值后,再获取i的值的时候,会访问该空间,得到的是被改变后的值。
2024-10-11 21:02:05
329
原创 C++如何把基类指针转换为子类指针&强制类型转换
在C++中,可以使用 dynamic_cast运算符将基类指针转换为子类指针。dynamic_cast是一种安全的转换方式,它会在运行时检查转换是否合法。需要注意的是,。此外dynamic_cast只能用于类型的转换,。如果转换成功,dynamic_cast将返回指向派生类对象的指针;如果转换失败,dynamic_cast将返回空指针(nullptr)。因此,在进行dynamic_cast转换后,最好使用条件语句来检查转换的结果,以避免使用空指针进行操作。
2024-10-11 13:39:14
980
原创 socket关闭有什么API,区别在哪里?
shutdown – 即便在多进程的情况下面,也是直接进行关闭的,关闭了socket 文件描述符,其他进程的也会被关闭,但他关闭的时候只关闭一半,即发送数据通道关闭,接收数据还是可以的。close ----- 在多进程的情况下,关闭本进程的socket,但这只是socket的引用计数减1,用这个socket的其它进程还能用这个链接,能读或写这个socket,直到所有的进程都进行了close,才真正关闭这个套接字,但当它。socket的关闭有close 和shutdown两种API,那么他们的区别在哪里呢?
2024-10-11 13:19:28
239
原创 printf详解
printf("hello \nworld\n"):将hello word打印到屏幕上,在使用printf函数时可以占位符:在printf中,占位符可以被指定的数值替换1和2、3的区别是1这一代码的数字3是不能改变的,而且2/3语句中因为使用了占位符%d,所以是可以改变相应数字的,只需要将后面的数字更改为定义的变量就可以4这句代码中,%s代表字符占位符,可以输入相应的字符,注意5这句代码中混合使用了字符占位符和整型占位符,可以输入相应的内容,注意后面输入的内容的顺序和前面的占位符的顺序要相同%s。
2024-09-27 17:22:18
1136
原创 push_back(std::move(string))与emplace_back(string)
移动(Move)操作则是将一个对象的资源转移到另一个对象,这通常只涉及到修改指针或其他简单的内部状态,而不是复制整个数据,因此比复制要快。如果你想要添加一个已经存在的对象,并且想要避免复制,那么使用push_back(std::move(string))是合适的。构造(Construct)操作直接在预分配的内存空间中创建对象,通常是最高效的,因为它避免了不必要的内存分配和数据复制。复制(Copy)操作会创建对象的一个完整副本,这涉及到分配新的内存和复制现有对象的数据,这是三者中最耗费资源的操作。
2024-09-23 14:48:25
322
原创 一些面试问题
或者使用HTTP2协议,也可以很好的减少报文的体积,提高传输效率。HTTP:如果是基于HTTP1.1的协议,请求中会包含很多无用的内容,如果是基于HTTP2.0,那么简单的封装以下是可以作为一个RPC来使用的,这时标准RPC框架更多的是服务治理。3. 性能消耗,主要在于序列化和反序列化的耗时:RPC:可以基于protobuf实现高效的二进制传输。HTTP:大部分是通过json来实现的,字节大小和序列化耗时都比protobuf要更消耗性能。4. 负载均衡:
2024-09-21 15:24:34
1378
原创 十种排序算法
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。
2024-09-19 15:07:14
800
原创 指针和引用;内联函数和普通函数
指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。可以有const指针,常量指针可以改变指向,指针常量不能改变指向,也可以有const引用,引用的指向不能改变;指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;指针的值在初始化后可以改变,即指向其它的存储单元。
2024-09-19 13:02:49
428
原创 static关键字修饰全局变量、成员变量、局部变量的区别
static实际修改了局部变量的存储类型,将原本应该存储在栈区的局部变量存储在静态区。静态区上数据存储的特点是,程序结束变量才被释放。我们常见的全局变量就是存储在静态区上。栈区上数据的特点是入栈创建出栈销毁,所以说局部变量的作用域仅在相应。在编译阶段会被添加到符号表中,在链接阶段对其进行解析和符号重定位。生命周期:生命周期没变,因为全局变量任然存储在静态区上。生命周期:生命周期变长,程序结束生命周期才结束。作用域:作用域不变,只是出作用域不被销毁。作用:改变了全局变量的链接属性。,因为出代码块时被销毁。
2024-09-19 11:17:11
483
原创 嵌套/双层循环中的continue和break详解
大部分直到在一层循环中continue和break的作用,其作用为:continue:跳过这次循环,直接开始下一次循环break:直接结束循环但在嵌套循环中,却不清楚这两的作用范围。
2024-09-15 11:04:24
641
原创 裸指针是什么?unique_ptr的实现?shared_ptr的陷阱
unique_ptr删除了拷贝构造和赋值运算,加入了移动构造和移动赋值,解决了资源归属的问题,同时拥有自己的默认删除器,可以通过其来判断是调用删除一个对象的析构函数还是调用删除一组对象的析构函数。当使用explicit修饰构造函数时,它将。explicit是C++中的一个关键字,3. shared_ptr使用陷阱。由类型直接定义的指针。
2024-09-14 18:22:50
663
原创 设计线程池应该考虑的东西
参考线程池(ThreadPool)是一种基于池化技术设计用于执行异步任务的机制,它维护了一定数量的线程,这些线程可以被反复利用来执行不同的任务。线程池的设计涉及到多个参数,这些参数共同决定了线程池的行为和性能。
2024-09-14 14:33:32
928
原创 Get请求和Post请求
Get请求适用于获取数据、查询、搜索等操作,传递数据量较小且不敏感的情况下;而Post请求适用于提交数据、创建资源、传递大量数据或敏感信息的情况下。需要注意的是,Get请求的参数会附加在URL中,而Post请求的参数在请求体(body)中,所以对于传输大量数据或敏感信息,更推荐使用Post请求。
2024-09-14 13:37:56
435
原创 当连接一个 IP 不存在的主机时,TCP握手过程是怎样的?
同时,本机会不断发出ARP请求,企图获得目的机器的 MAC 地址。不管目的IP是回环地址还是局域网内外的IP地址,目的主机的传输层都会在收到握手消息后,发现端口不正确,发出RST消息断开连接。当然如果目的机器设置了防火墙策略,限制他人将消息发到不对外暴露的端口,那么这种情况,发送端就会不断重试第一次握手。如果IP在局域网内,会发送N次ARP请求获得目的主机的MAC地址,同时不能发出TCP握手消息。如果IP在局域网外,会将消息通过路由器发出,但因为最终找不到目的地,触发TCP重试流程。
2024-09-14 11:43:18
288
原创 进程和线程的区别
是操作系统(OS)的基本单位,而是处理器(CPU)的基本单位。每个都有和,程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。线程是进程的一部分,所行过程不是一条线的,而是多条线(线耗)其被称为轻权进程或者轻量级进程。线程共享本进程的资源如内存、I/O、cpu等,不利于资源的管理和保护,而进程之间的资源是独立的,能很好的进行资源管理和保护。。所以多进程要比多线程健壮。
2024-09-12 16:27:02
1104
原创 HTTP和HTTPS
HTTP和HTTPS在差异方面,最显著的是安全性。HTTP是明文传输协议,而HTTPS是加密传输协议。这种加密特性使得HTTPS在传输敏感信息时更具优势。此外,浏览器地址展示方式也有所不同,HTTPS有绿色安全锁标志,而HTTP则有网站不安全标志提醒。在协议层面,HTTPS在HTTP的基础上加入了SSL安全认证证书,从而提供了更高级别的安全防护。在涉及敏感信息传输的场景中,如在线购物、银行业务等,基本都是用HTTPS协议进行数据传输。3. GET和POSE有什么区别。
2024-09-12 14:04:29
1178
原创 TCP、UDP的区别及各自适用的场景
也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达,因为tcp可靠,面向连接,不会丢失数据因此适合大数据量的交换。UDP协议非常适用于视频、音频等数据流的传输,因为UDP协议的实时性比TCP更好。UDP协议虽然没有TCP协议的可靠性,但是在数据传输时,UDP协议可以实现更低的延迟和更高的吞吐量。(1)TCP是面向连接的,udp是无连接的即发送数据前不需要先建立链接。(6)TCP是面向连接的可靠性传输,而UDP是不可靠的。(5)TCP的首部较大为20字节,而UDP只有8字节。
2024-09-12 11:44:33
374
原创 PING和ARP工作在哪一层
在TCP/IP模型中,ARP直接生成自己的报文,不需要经过IP协议的封装,然后这些报文会被数据链路层协议(如以太网)进一步封装。在不同的网络模型中,ARP的位置反映了模型的设计哲学和协议的实际运作方式。这意味着ARP的实际数据交换发生在数据链路层,尽管它的功能是为了服务网络层的需求。这是因为ARP的主要功能是在同一局域网内解析出设备的物理地址,这个过程涉及到数据链路层的帧和物理层的硬件地址。综上所述,ARP作为网络层协议,其数据在实际传输时是封装在数据链路层的,以便能够在局域网内进行有效的通信。
2024-09-12 11:32:57
549
原创 count(1)、count(*)和count(字段)
其次有很多关于COUNT(1)和COUNT(*)性能不同的说法(COUNT(1)比COUNT(*)性能好),但实际上,这两种查询方式在实现上没有区别,而且效率一样。首先要知道COUNT(1) 和 COUNT(*)表示的是直接查询符合条件的数据库表的行数,而COUNT(列名/字段)表示的是查询符合条件的列的值。COUNT(字段):不包括对NULL的统计。1、count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL。COUNT(1)和COUNT(*):包括对NULL的统计。
2024-09-12 09:46:34
331
原创 Minimax-秋招正式批-面经(计网)
HTTP无状态协议,是指协议对于交互性场景没有记忆能力。举个例子在点击一个纯的html网页,请求获取服务器的html文件资源时,每次http请求都会返回同样的信息,因为这个是没有交互的,每一次的请求都是相互独立的。第一个请求和第二个请求也没有先后顺序,返回处理哪个,结果都是同样的资源页面,因为这种场景是无交互的,无论是什么人请求这个地址,服务器都是返回那个相同的响应。在无交互场景中上面那样,当然也不会有太大的问题。但是对于涉及到动态交互的场景,就显得很尴尬了,何为交互?
2024-09-06 22:55:27
918
原创 Minimax-秋招正式批-面经(SQL相关)
自增ID:适用于大多数需要高效查询和插入操作的场景。它简单易用,索引效率高,但需要注意在高并发下的锁争用问题和信息泄露风险。UUID:适用于需要全局唯一标识符的场景,特别是在分布式系统中。然而,其随机性导致了较低的索引效率和较高的插入成本。HTTP无状态协议,是指协议对于交互性场景没有记忆能力。举个例子在点击一个纯的html网页,请求获取服务器的html文件资源时,每次http请求都会返回同样的信息,因为这个是没有交互的,每一次的请求都是相互独立的。
2024-09-06 11:31:31
1267
原创 如何用UDP实现可靠传输?
综上所述,通过应用层的确认机制、数据校验和重传、序列号和确认号、超时重传以及流量控制和拥塞控制等方法,你可以在UDP上实现一定程度的可靠传输。这些机制的具体实现方式和参数设置需要根据实际需求和应用场景进行调整。UDP是一种面向无连接的传输协议,不提供可靠性保证。然而,你可以在UDP的基础上实现一些机制来增加可靠性。需要注意的是,尽管这些方法可以增加UDP传输的可靠性,但它们会。,并根据具体的应用场景选择适当的机制。在设计和实现可靠UDP传输时,需要。
2024-09-05 15:31:16
427
原创 哈希表、红黑树
哈希表的底层实际上是基于来存储的,当插入时,并不是直接插入该数组中,而是通过对键进行得到Hash值,然后和,得到后再插入。取值时,先对指定的键求Hash值,再和容量取模得到底层数组中对应的位置,如果指定的键值与存贮的键相匹配,则返回该键值对,如果不匹配,则表示哈希表中没有对应的键值对。这样做的好处是,当然这种是最极端的情况,极少遇到。
2024-09-05 09:50:10
1098
原创 192.168.0.1和127.0.0.1和0.0.0.0
0.0.0.0为windows对所有未知ip的地址描述包括网卡dhcp的取得的地址pppoe的ip及其它非本机指定ip.0.0.0.0是全零网络,代表默认网络,帮助路由器发送路由表中无法查询的包。使用“ping 127.1”这个命令也能得到同样的测试结果,其实“ping 127.1”和“ping 127.0.0.1”这两条命令是一样的,都是在进行回路测试。然后输入ping 192.168.0.1,如果返回的结果是timeout,说明网络不通或者丢包,就表示你的电脑不能连接到路由器。:127.0.0.1。
2024-09-04 16:55:43
414
原创 科大讯飞--C++开发--面经
MSL就是最大的报文生成时间,MSL是网络报文生存的最长时间,超过这个时间,报文将会被丢弃,因为TCP是基于IP协议的,TTL是经过路由器的最大跳数,每经过一个路由器,TTL就减一,当减到0的时候报文就会被丢弃,同时发送ICMP报文给源主机.TTL 与 MSL的区别 : TTL是经过路由的最大跳数,MSL是报文生存的最长时间,要确保MSL>=TTL才能保证报文是正常消亡.
2024-09-02 20:06:30
1211
原创 MySQL约束与事务
注意:空字符串不等于null,0也不等于null如果没有使用not null约束,那么默认情况下所有的类型都是可以为null的非空约束只能设置成列级约束1)如何在建表时创建非空约束2)创建完这个表后,如下几种情况会报错使用insert插入数据,id或者last_name的值为null使用insert插入数据,没有给id或者last_name字段赋值,且没有指定它的默认值只用update更新数据,给id或者last_name字段传递的值为null。
2024-09-02 17:08:57
859
原创 进程间通信、线程间通信
线程的信号和进程的信号量类似,使用线程的信号量可以高效地完成基于线程的资源计数。linux除了支持Unix早期信号语义函数signal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。
2024-08-28 23:40:37
913
原创 深信服-秋招提前批-笔试
7. 现在有两堆石子,一堆有2颗,另一堆有5颗,两人轮流拿石子,一人一次只能选择从一堆中拿一颗或两颗石子,两人轮流拿取,无石子可拿即判负,双方都按照最优方法选择,此时()(先手or后手)取胜。6. 设栈S和队列Q的初始状态均为空,元素a,b,c,d,e,f,g依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是b,d,c,f,e,a,g,则栈S的容量至少是()这是因为需要从链表头开始遍历,找到合适的插入位置,而这需要遍历链表的节点,最坏情况下需要遍历到链表的末尾,时间复杂度为 O(n)。
2024-08-27 09:49:47
1089
原创 思特威-秋招正式批-笔试
总数据量为:640x480x1.25 Bytes的图像,数据格式如上图示,将数据按照P1[9:0] P2[9:0] P3[9:0]......解析,代码实现。4. 人员1: Tina,女,13256471234,上海浦东新区。人员2:Kelvin,男,13678942587,上海普陀区。人员3:Lily,女,18645671234,上海嘉定区。人员4:Jucy,女,18578964578,上海长宁区。人员5:Zack,男,19645783247,上海徐汇区。循环中,缺少分号,导致语法错误。
2024-08-26 21:34:15
572
原创 TCP拥塞控制和流量控制
左边是拥塞控制,多对一,接收方只有一个,发送方有很多个。接收方察觉到网络拥塞后并不知道是哪几台主机发送速率过快/发送内容过多导致的,是一个。右边是流量控制 ,一对一,接收方只有一个,发送方也只有一个。接收方收到数据来不及接收,直接就知道找哪个发送方,是。这二者都是接收方要求发送方减慢自己的发送速率。拥塞控制主要是因为网络发生了堵塞,导致很多。而流量控制是发送方发送的速率过快,导致。
2024-08-26 16:03:41
267
原创 网关、路由器、交换机
应用场景例子: 在办公室网络中,交换机连接多台电脑、打印机和服务器,通过内部的MAC地址表决定每个数据包的传输路径,以确保快速和可靠的局域网通信。网关与路由器: 网关通常是一个广义的术语,可以是硬件或软件,用于连接不同类型的网络;应用场景例子: 在家庭网络中,路由器连接多个设备(如电脑、手机、智能家居设备)到互联网,并且能够管理内部网络中的数据流量。应用场景例子: 在企业网络中,网关可以是连接内部局域网和外部互联网的设备,充当安全防火墙和访问控制的角色。做转发,不同网络之间互相连接用到的设备。
2024-08-26 12:22:47
823
原创 字节-C++实习-面试
由于类的多态性,基类指针可以指向派生类的对象,如果删除该基类的指针,就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。在这种情况下,调用哪个函数是根据指针或引用的静态类型(即编码时指定的类型,而不是运行时的实际类型) 来决定的。可以根据对象的实际类型调用相应的函数,即使是在基类的指针或引用上调用。,在C++中,这种绑定可以是静态的(编译时决定)或动态的(运行时决定)。,因为函数调用的决策在编译时就已经完成了,不需要在运行时进行查找。
2024-08-23 14:35:24
663
原创 帆软-秋招提前批-笔试
1. 有四个同学,每个人得到的桃子数量不同,4个到7个之间。然后,4个人都吃掉了1个或2个桃,结果每个人剩下的桃数量还是各不相同。4个人吃过桃后,说了如下的话。其中,吃了2个桃的人撒谎了,吃了1个桃的人说了实话。安娜:"我吃过红色的桃。" 杰瑞:"安娜现在手里有4个桃。" 凯特:"我和简一共吃了 3个桃。" 简:"杰瑞吃了2个桃。凯特现在拿着的桃数量不是3个。"请问:最初杰瑞手里有几个桃?A. 5 B. 7 C. 6
2024-08-22 20:19:39
1357
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人