面经-C++
C++运行时多态机制
- 虚函数机制(如何实现的):当一个类中定义了虚函数之后,其对象存储布局之中会生成一个虚函数指针,该虚函数指针指向了一张虚函数表, 虚函数表里面存放的是虚函数的入口地址
- 虚函数机制被激活的条件:
- 1.基类要定义虚函数
- 2.派生类要重定义(覆盖)基类虚函数
- 3.创建派生类对象
- 4.基类指针指向派生类对象(基类引用绑定到派生类对象)
- 5.通过基类指针(引用)调用虚函数
- 为什么构造函数不能设为虚函数?
- 答: 根据虚函数被激活的条件,先要创建对象,才会生成虚函数指针, 之后才能使用虚函数
- 类中定义虚函数后,内存中有一个指针大小的数据,即虚函数指针
- 虚指针的生成条件
- 类中声明了虚函数(包括继承的虚函数)
- 虚函数的存在会导致所有该类的对象(包括派生类对象)携带 vptr
补充C++静态多态
静态成员函数可不可以是虚函数
static静态成员函数不能定义为虚函数。 static成员不属于任何类对象或类实例,静态成员函数没有this指针。 虚函数依靠vptr和vtable来处理。
原子变量与互斥锁性能对比分析
低竞争场景:
- 原子变量:性能显著优于互斥锁,因无锁机制直接利用硬件指令,操作在纳秒级别完成。
- 互斥锁:加锁/解锁操作涉及少量系统调用或原子指令(如futex),但仍比原子变量慢数倍。
高竞争场景:
- 原子变量:频繁的CAS失败可能导致大量重试(如自旋),CPU占用率高,但线程不会阻塞。性能可能优于互斥锁,但需结合退避策略优化
- 互斥锁:线程阻塞减少CPU浪费,但上下文切换频繁时延迟显著增加。自适应锁(如Linux的pthread_mutex)可能在用户态自旋后转入阻塞,平衡性能
面试官可能想问伪共享
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Moyin!