面试复盘 C++

面了几家公司,总结一下遇到的面试问题。

1. 指针和引用有什么区别 ? C++ 引用类型大小是多少?怎么写程序计算引用类型的大小?
    C++ primer 上说引用没有大小,但面试官的意思是有大小的。计算大小可以写个类,里面包含一个引用类型,sizeof 类大小

2.  _cdecl 和 _stdcall 的区别?
_cdecl 是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。
_stdcall 是StandardCall的缩写,是C++的标准调用方式:所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。这些堆栈中的参数由被调用的函数在返回后清除,使用的指令是 retnX,X表示参数占用的字节数,CPU在ret之后自动弹出X个字节的堆栈空间。称为自动清栈。函数在编译的时候就必须确定参数个数,并且调用者必须严格的控制参数的生成,不能多,不能少,否则返回后会出错。

3. C++ share_ptr 如何实现?有什么问题?如何解决这个问题?你有没有其他方法解决这个问题?
用引用计数
循环引用
weak_ptr
第四个问题我回答的是可以使用类似java、go 内存回收的机制。然后面试官又问,java、go 内存回收机制怎么实现。我人麻了。下来查了一下,面试官想要的回答是 mark and sweep 和三色标记法这些。

4. 你知道 share_from_this 吗?
c++11中的shared_from_this()来源于boost中的enable_shared_form_this类和shared_from_this()函数,功能为返回一个当前类的std::share_ptr
使用场合:当类A被share_ptr管理,且在类A的成员函数里需要把当前类对象作为参数传给其他函数时,就需要传递一个指向自身的share_ptr。
我们就使类A继承enable_share_from_this,然后通过其成员函数share_from_this()返回当指向自身的share_ptr。
以上有2个疑惑:
把当前类对象作为参数传给其他函数时,为什么要传递share_ptr呢?直接传递this指针不可以吗?
一个裸指针传递给调用者,谁也不知道调用者会干什么?假如调用者delete了该对象,而share_tr此时还指向该对象。
这样传递share_ptr可以吗?share_ptr <this>
这样会造成2个非共享的share_ptr指向一个对象,最后造成2次析构该对象。

5. vector 扩容机制?1.5倍扩容为什么可以利用先前的地址?vector 在拷贝对象时如何优化?
1.5倍扩容或2倍扩容。
拷贝对象优化这个问题我不太清楚。底层应该使用的是类似 memcpy 的方式,或者可以实现一个 relloc 的方法在原地扩充空间。

6.虚函数是什么?解决什么问题?对象内存结构是什么?多继承对象内存结构?菱形继承虚函数指针会怎么样?虚表内部结构是什么?
。。。
7. 如何用 c 语言实现多态?
方案一:用结构体和指针模拟C++ 类和虚表
方案二:用宏模拟消息映射或元对象(信号和槽)

8. hash表底层实现是什么?如何解决hash冲突?C++ STL 用哪种方法?
hash 函数映射下标地址
开链法(拉链法)
开放地址法
再hash法
C++ STL 使用开链法,当链表长度大于8时,将链表组织成一颗红黑树

9. malloc 底层实现?
操作系统系统调用
内存池

10. TCP TIME_WAIT 为什么要等待 2MSL 的时间?
两个理由:
保证客户端发送的最后一个ACK报文段能够到达服务端。
这个ACK报文段有可能丢失,使得处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认,服务端超时重传FIN+ACK报文段,而客户端能在2MSL时间内收到这个重传的FIN+ACK报文段,接着客户端重传一次确认,重新启动2MSL计时器,最后客户端和服务端都进入到CLOSED状态,若客户端在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到服务端重传的FIN+ACK报文段,所以不会再发送一次确认报文段,则服务端无法正常进入到CLOSED状态。
防止“已失效的连接请求报文段”出现在本连接中。
客户端在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。

11. TCP 和 UDP 的应用场景? HTTPS 用 TCP 还是UDP? HTTPS 不能用UDP 吗? 直播软件用TCP 还是UDP?

12. SYN 攻击是什么?如何防范?

13. 手写一个观察者模式?观察者模式你为啥用List 不用 map ?

14.  红黑树你了解多少?

15. 跳表你了解多少?

16. 一个程序编译运行的过程?链接具体做什么? 什么是符号决议?什么是重定向?重定向地址是什么地址?

17. 读写锁怎么实现?你实现方式是读者优先还是写着优先? 什么是读者优先?什么是写者优先?

18.malloc(200) 后发生什么?

19. 一条 SQL 语句执行的整个过程?

20. 进程切换的过程?逻辑地址如何转换为物理地址?什么是缺页中断?

21. MySql 主从复制说一下?如果主数据库一条同步语句丢失,读从数据库会数据不一致,如何解决?

22. MySql 索引执行过程?

23. 虚拟内存机制?进程间共享虚拟内存如何实现?

24. windows 内存管理?

25. linux 如何查看进程打开文件信息?
lsof

26. linux 如何查看网络信息?
netstat tcpdump

27. 数据仓库了解吗?大数据框架了解吗?

28. 如何实现分布式锁

29. Linux 统计某个字符出现的行数

30 top k 算法,时间复杂度是多少?

31. SQL 查询两个表,按年龄排序,按性别分组 

算法题:
链表倒数第N个节点
对称二叉树
一个数字删除k位后最大是多少
大数相乘
字符串还原ip
判断一个ip是否合法
二叉树层次遍历





#2021届秋招进度交流##C/C++##学习路径#
全部评论
楼主科班非科班
点赞 回复
分享
发布于 2021-09-30 18:54

相关推荐

5 42 评论
分享
牛客网
牛客企业服务