C++基础八股-3.21/22

1. 被free回收的内存是立即返回给操作系统吗?
2. sizeof和strlen的区别?
3. new/delete、malloc/free的区别
4. 堆快一点还是栈快一点?
5. 在main执行之前和执行之后执行的代码可能是什么?
6. final和override的关键字?
7. 拷贝初始化和直接初始化?
8. select、poll、epoll
9.Reactor?
10. 阻塞、非阻塞、同步、异步?
11. Proactor?

1. 被free回收的内存首先会被ptmalloc使用双链表保存起来,当有用户申请内存的时候,会直接从这里面找出合适的内存进行返回。这样可以避免操作系统的频繁调用,另外它还会将小内存进行合并,防止产生过多的内存碎片;

2. sizeof是运算符,strlen是库函数。sizeof的参数可以是任何数据的类型或数据,strlen的参数只能是字符串的指针,且结束符为'\0'的字符;

3. 前者是C++运算符,后者是C/C++库函数;new自动计算要分配的内存对象,malloc需要计算;new是类型安全的,malloc不是;调用new的给自定义对象分配内存的时候,会调用构造函数并分配相应的内存,delete的时候会释放内存并执行析构;

4.  栈快一点,操作系统堆栈提供支持,有分配专门的寄存器存放栈的地址,栈的出入栈也十分简单,并且有专门的指令执行,所以栈的效率更高更快;而堆在分配的内存的时候要使用算法寻找合适大小的内存,并且在获取堆的内容的时候需要两次访问,一次指针,一直是指针保存的地址

5. 初始化全局变量和静态变量,即.data段数据,将未初始化的全局变量进行赋值;全局对象初始化;将argc、argv传递给main函数;___attribute___(constructor);结束后,全局的析构函数会在main函数执行完后析构,可用一个atexit注册一个函数会在main函数之后执行;___attribute___(destructor)

6. override的关键字,指定了子类的这个虚函数必须重写父类的,如果函数名不小心打错了,编译器会进行报错,不会通过;当不希望某个类被继承、或不希望虚函数被重写可以在类名和虚函数后面添加final关键字;

7. 直接初始化直接调用与实参匹配的构造函数;拷贝初始化首先使用指定构造函数创建一个临时对象,然后用拷贝构造函数将那个零食对象拷贝到正在创建的对象;

8. select函数将已连接的socket都放到一个文件描述符集合,然后调用select函数将文件描述符拷贝到内核中,去遍历进行检测那个套接字发生事件,将其进行标记,后续再复制到用户态,进行遍历找到标记的套接字。这其中发生了2次遍历文件描述符集合和2次拷贝文件描述符集合。poll突破文件描述符个数的限制(1024),通过一个动态数组,以链表的形式管理。其它与select还是一样的。epoll通过在内核中使用红黑树来跟踪进程所有待检测的文件描述符,把需要监控的socket通过epoll_ctl函数加入到内核中的红黑树,第二,epoll使用时间驱动的机制,内核里维护了一个链表来记录就绪事件,当某个socket事件发生时,通过回调函数内核将其加入到就绪事件列表中,当用户调用epoll_wait函数时,只会返回有事件发生的文件描述符的个数。

9. reactor模型是 I/O 多路复用监听事件,收到事件后,根据事件类型分配(Dispatch)给某个进程 / 线程。单reactor单进程:reactor对象通过epoll监听事件,收到事件后通过dispatch进行分发,如果是连接建立的事件交个Acceptor对象进行处理,如果不是就交给Handle对象通过read->业务处理->send的流程来完成完整的业务流程。单reactor多线程:对于不是连接建立事件,则交由Handler对象处理,他不负责业务处理,只负责数据的接受和发送,数据会发送给线程池来进行业务处理,处理完成后将业务结果返回给handler对象,然后发送给client;多reactor多线程:主线程只负责接受新连接,子线程负责完成后续的业务处理。主线程只需要把新连接传给子线程,子线程进行业务处理后,直接可以将处理结果发送给客户端。

10. 阻塞I/O:当用户执行read,线程会被阻塞,一直等到内核数据准备好[1],并把数据从内核缓冲区拷贝到应用缓冲区中[2],当拷贝完成,read才返回。非阻塞I/O:可以在数据未准备好久立即返回,然后应用程序不断轮训内核,直到数据准备好,[2]操作还是要的;异步I/O:上面的[1]和[2]的步骤都不需要等待,都交由内核完成。

11. Reactor模式是基于待完成的I/O事件,而Proactor模式是基于[已完成]的I/O事件。
全部评论
第八题漏了😍
1 回复 分享
发布于 03-21 23:54 广东
cpp八股
点赞 回复 分享
发布于 04-13 16:16 湖南
mark一下
点赞 回复 分享
发布于 03-24 01:13 广东

相关推荐

MCP(模型上下文协议)可以理解成一个“AI翻译官+智能管家”的组合体,它的核心作用是让AI大模型能更流畅地与外部世界“对话”和“合作”。用生活化的例子来解释:1. MCP是AI的“万能翻译官”假设你有一个只会说中文的AI助手,但你想让它帮你操作家里的英文智能音箱、查询法国天气、甚至调用公司的数据库。这时候,MCP就像一个翻译官:统一语言:它把AI的“中文指令”翻译成各种设备/系统能听懂的语言(比如API接口、数据库查询语句),同时把外部系统的反馈再翻译回中文告诉AI。打破隔阂:无论设备是国产的还是进口的,只要支持MCP协议,AI都能直接“喊话”操作,不用为每个设备单独学外语。2. MCP是AI的“任务调度员”当AI需要完成复杂任务时(比如“帮我订一张明天上海飞北京的机票,然后发邮件通知同事”),MCP会像管家一样拆分任务:分步执行:先让AI查航班信息,再调用订票接口,最后通过邮件工具发通知。自动纠错:如果某个步骤失败(比如航班售罄),MCP会告诉AI重新规划,比如“换下午的航班”或“改高铁”。3. MCP是AI的“记忆助手”大模型虽然聪明,但容易“健忘”(比如对话太长就记不住上下文)。MCP的作用是:整理重点:把长对话压缩成“关键词+逻辑链”,比如把“用户昨天说喜欢川菜,今天要请客”简化成“用户需求:川菜餐厅推荐,6人,预算500元”。按需调用:当AI需要回忆细节时,MCP会快速“翻笔记”,而不是让AI从头读所有对话。4. MCP是AI的“安全保镖”当AI需要操作敏感信息(比如银行账户、医疗记录)时,MCP会:检查权限:确认AI有资格访问这些数据(比如用户已授权)。加密通道:像“保密通话”一样,确保数据传输过程中不被窃听。MCP让AI从“学霸”变成“社会人”没有MCP时,AI像是一个只会读书的学霸,虽然知识渊博,但不会用手机、不会点外卖、不会打车。有了MCP,AI就像一个精通多国语言、会规划行程、能处理突发状况的“社会人”,能无缝融入我们的日常生活和工作场景。         
点赞 评论 收藏
分享
评论
24
115
分享

创作者周榜

更多
牛客网
牛客企业服务