1. 程序编译的过程?
程序编译大致可以分为两个阶段,编译阶段和链接阶段。
编译阶段包括,编译预处理(主要是宏定义,文件引用等);编译优化(主要检查语法);汇编;
链接阶段包括,链接动态库中的函数或者变量;
2. 程序空间?
NOTE: BSS 只占用运行时内存,不占用文件空间;如果初始化为0的全局变量,其实还是会放到BSS里。
名称 | 概念 |
栈(stack) | 主要记录程序的调用,记录程序的参数和局部变量值。 |
堆(heap) | 程序在运行中开辟的空间,如new/malloc |
BSS(Block Start by Symbol) | 存放没有初始化的全局变量和静态变量;(但是Linux系统和Windows系统都会对全局变量做0初始化); |
数据段(data) | 存放已经初始化的全局变量和静态变量; |
代码段(text) | 程序二进制代码空间,也存放一些常量如字符串等。 |
3. TCP/UPD的区别?
TCP | UDP | |
可靠性 | 可靠 | 不可靠 |
连接性 | 面向连接 | 无连接 |
报文 | 字节流 | 面向报文 |
效率 | 效率低 | 效率高 |
双工性 | 双工 | 一对一,一对多,多对一,多对多 |
流量控制 | 滑动窗口 | 无 |
拥塞控制 | 慢开始、拥塞避免、快重传、快恢复 | 无 |
传输速度 | 慢 | 快 |
应用场景 | 对效率低、对准确性要求高,或者连接性的场景 | 对效率要求高、对准确性要求低。 |
4. TCP三次握手,四次挥手内容?
三次握手:
A --> SYN + seq(J) --> B
A <-- SYN + seq(K), ACK + ack(J + 1) <-- B
A --> ACK + ack(K + 1) --> B
四次挥手:
ACK和FIN之间还会有数据传输。
5. C++程序的左值引用和右值引用?
左值引用就是一般的引用;
右值引用是C++11之后的新特性,通常如果不能取地址,没有名字,临时的变量就是右值引用;
比如函数返回值;或者寄存器中的常量(立即数);都需要用右值引用;
使用方法是 int &&x = 10;(10是立即数,是无法取地址的,也没有名字)
5. C++多态?
C++多态是指在调用成员函数的时候,会根据对象的类型来选择不同的成员函数。
多态分为静态多态和动态多态;
静态多态也被称为早绑定/静态链接;函数在调用之前就准备好了;比如从Shape基类中继承得到的Triangle 和 Rectangle;调用共有的area方法的时候,会根据编译时的数据类型选择;但是如果使用Shape指针对子类的实例进行引用,在调用的时候只会调用Shape的area;为什么呢?这是因为在编译阶段对Shape类型早绑定到了Shape的area函数上。
动态多态的目的就是解决在指针是父类指针的情况下,调用子类的方法;具体实现需要在父类声明的时候加上 virtual 关键字,这就告诉编译器不要静态链接到该函数,而是根据运行时的数据类型来选择成员函数。纯虚函数 时 virtual area() = 0; 这样的话,父类无法创建实例。
6. C++标准库有那些容器?
vector, list, forward_list, deque,queue, array, stack, set, map, pair, tuple, priority_queue
引用文章
7. C++标注库sort的实现?
sort 方法其实是 快排+插入排序/对排序的结合
一般情况下,是先调用快排,然后分治到节点个数比较小的情况下切换成插入排序;如果在排序中出现退化的倾向,那么会调用堆排序。
一般节点个数比较少的情况下,递归的开销大于插入排序的开销。
8. 大规模数据为什么使用快排?
归并排序/堆排序需要额外的空间开销,但是快排不需要;如果是链表结构,那么可能归并排序更加合适;
9. 视频会议使用什么TCP/UDP协议?
视频会议使用UDP协议,因为视频会议要求低延迟,并且不要求可信信道,运输像素数据的损失;
10. 进程和线程和协程区别?
进程之间相互独立,不共享申请到的计算机资源;
线程之间不是相互独立的,申请到的计算机资源是共享的;
一般进程比线程更加健壮;
协程比线程更加轻量,用户可以自主控制协程的切换;
11. Linux 系统执行程序的过程?
(1)可执行文件被加载到内存;
(2)初始化程序的运行环境;
(3)调用入口函数,执行程序;
(4)关闭程序占用资源,清理内存;