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事件。
全部评论
第八题漏了😍
点赞 回复 分享
发布于 03-21 23:54 广东

相关推荐

03-21 19:40
已编辑
华中科技大学
2.26暑期第四面,淘天某部门研发工程师C/C++,提前约好了时间并告知是电话面,下午快六点面完后晚上八点多就接到电话约了二面,一面面试官听声音感觉很年轻,面了大概40min1. 自我介绍,然后开始逐个聊项目细节2. 问websocket协议+消息格式的封装3. 问第一个项目能支撑到多少的并发、单个事务的延迟是多少4. 问不能支持更高并发的瓶颈是什么5. 项目中访问的服务商API实测延迟是多少6. 问第二个项目中的关键设计,简历上写到的一些功能是如何去实现的7. 第三个项目涉及到grpc和pb,问技术选型的考量8. grpc作为一个类似二进制的RPC框架,底层是什么原理?比如说协议设计、封装格式等等方面9. 接下来开始聊实习,细说实习内容,顺便问了一下了不了解当时用的一些仪器的原理,我没答上来,面试官说实习四个月都没有好奇底层原理想把它弄明白嘛(是的没错)10. 对于k8s的了解大概是什么程度11. 给了一道算法题,思考后说怎么做+时间空间复杂度:有n个点的有向无环图,邻接矩阵为d[i][j],数值范围是1到10e9,如果d[i][j]为0的话就说明i到j没有边,求满足点1到点n的路径长度为17的倍数这个约束条件的最短路径(不知道为什么电话面要做算法,听题目听了好久想了一会儿做出来了,用二维动态规划,不过时间复杂度好像答错了,面试官说回去再想一想)12. 反问环节:问了一下业务和base这次面试还是比较简单的,感谢善良的面试官小哥哥虽然二面后还在泡着#淘天##面经##C++##牛客AI配图神器#
查看12道真题和解析
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
5
分享

创作者周榜

更多
牛客网
牛客企业服务