我简历里写的是C++,面试官说问C也可以。于是我让他问我C语言。
1.堆栈有什么区别?
1、堆栈空间分配不同。栈由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等,栈有着很高的效率;堆一般由程序员分配释放,堆的效率比栈要低的多。
2、堆栈缓存方式不同。栈使用的是一级缓存, 它们通常都是被调用时处于存储空间中,调用完毕立即释放;堆则是存放在二级缓存中,速度要慢些。
3、空间大小: 栈的空间大小并不大,一般最多为2M,超过之后会报Overflow错误。堆的空间非常大,理论上可以接近3G。(针对32位程序来说,可以看到内存分布,1G用于内核空间,用户空间中栈、BSS、data又要占一部分,所以堆理论上可以接近3G,实际上在2G-3G之间)。
4、能否产生碎片: 栈的操作与数据结构中的栈用法是类似的。‘后进先出’的原则,以至于不可能有一个空的内存块从栈被弹出。因为在它弹出之前,在它上面的后进栈的数据已经被弹出。它是严格按照栈的规则来执行。但是堆是通过new/malloc随机申请的空间,频繁的调用它们,则会产生大量的内存碎片。这是不可避免地。
2.一个指针大小是多少?
在32位平台下,无论指针的类型是什么,sizeof(指针名)都是4,在64位平台下,无论指针的类型是什么,sizeof(指针名)都是8。
3.const限定的变量可以修改吗?怎么修改?
简单值类型不可变,如int、float
但const指针可以变,如
int a = 10; int b = 20; const int *p = &a; //该声明的意思是p指向一个const int(这里为10),因此不能使用p来修改这个值, //换句话来说,*p的值为const,不能被修改。 *p = 20; //错误,编译报错 p = &b; //正确,const只能防止修改p指向的值,但不能防止修改p的值,也就是说,可以将一个新地址赋给p
4.如何用C语言实现面向对象?
C++引入了新的数据类型——类,由此引申出了三大特性(1)封装。(2)继承。(3)多态。
5.用过函数指针吗?
函数指针本质是一个指针,其指向一个函数。
函数指针:int (*fun)(int x,int y);
函数指针使用过程中指向一个函数。通常用于函数回调的应用场景。
6.编程:把字符串转化为整数
略
7.TCP和UDP有什么区别?TCP是怎么实现可靠传输的?
(1)TCP需要建立一对一稳定连接;UDP无连接
(2)TCP一对一;UDP可以一对一、一对多、多对多
(3)TCP可靠传输,序列号、确认应答、超时重传;UDP不保证可靠传输,尽最大努力交付
(4)TCP头部字节20字节;UDP8个字节
(5)TCP开销大;UDP灵活开销小
(6)TCP提供可靠的服务,适用于通讯质量要求高的场景;UDP传输效率高,适用于高速传输和实时性要求的场景。
TCP保证可靠性:
1、序列号、确认应答、超时重传 数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序列号,序列号说明了它下一次需要接收的数据序列号,保证数据传输有序。如果发送方迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一段时间后进行重传。
2、窗口控制 TCP会利用窗口控制来提高传输速度,意思是在一个窗口大小内,不用一定等到应答才能发送下一段数据,窗口大小就是无需等待确认而可以继续发送数据的最大值。如果不使用窗口控制,每一个没收到确认应答的数据都要重发。 使用窗口控制,如果数据段1001-2000丢失,后面数据每次传输,确认应答都会不停发送序号为1001的应答,表示我要接收1001开始的数据,发送端如果收到3次相同应答,就会立刻进行重发;数据一旦丢失,接收端会一直提醒。
3、拥塞控制 如果把窗口定的很大,发送端连续发送大量的数据,可能造成网络的拥堵。为了防止拥堵,进行拥塞控制。
(1)慢启动:定义拥塞窗口,一开始将该窗口大小设为1,之后每次收到一次确认应答(一次成功来回传输),将拥塞窗口大小*2
(2)拥塞避免:设置慢启动阈值,一般开始都设为65536。拥塞避免是只当拥塞窗口大小达到这个阈值,拥塞窗口的值不再指数上升,而是+1
(3)快恢复:将报文段的超时重传看做拥塞,则一旦发生超时重传,我们就将阈值设为当前窗口大小的一半,并且窗口大小变为1,重新进入慢启动过程
(4)快速重传:3次重复确认应答,立即重传。
以上答案均来自本人专栏:机器学习面试题汇总与解析(蒋豆芽面试题总结)
#C++#