中金所技术C++开发面经

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

四次挥手:

中金所技术C++开发面经_第1张图片

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)关闭程序占用资源,清理内存;

你可能感兴趣的:(c++,网络,开发语言)