C++运行时多态机制

  1. 虚函数机制(如何实现的):当一个类中定义了虚函数之后,其对象存储布局之中会生成一个虚函数指针,该虚函数指针指向了一张虚函数表, 虚函数表里面存放的是虚函数的入口地址
  2. 虚函数机制被激活的条件:
    • 1.基类要定义虚函数
    • 2.派生类要重定义(覆盖)基类虚函数
    • 3.创建派生类对象
    • 4.基类指针指向派生类对象(基类引用绑定到派生类对象)
    • 5.通过基类指针(引用)调用虚函数
  3. 为什么构造函数不能设为虚函数?
    • 答: 根据虚函数被激活的条件,先要创建对象,才会生成虚函数指针, 之后才能使用虚函数
  4. 类中定义虚函数后,内存中有一个指针大小的数据,即虚函数指针
  5. 虚指针的生成条件
    • 类中声明了虚函数(包括继承的虚函数)
    • 虚函数的存在会导致所有该类的对象(包括派生类对象)携带 vptr

补充C++静态多态


静态成员函数可不可以是虚函数

static静态成员函数不能定义为虚函数。 static成员不属于任何类对象或类实例,静态成员函数没有this指针。 虚函数依靠vptr和vtable来处理。


原子变量与互斥锁性能对比分析

低竞争场景:

  • 原子变量:性能显著优于互斥锁,因无锁机制直接利用硬件指令,操作在纳秒级别完成。
  • 互斥锁:加锁/解锁操作涉及少量系统调用或原子指令(如futex),但仍比原子变量慢数倍。

高竞争场景:

  • 原子变量:频繁的CAS失败可能导致大量重试(如自旋),CPU占用率高,但线程不会阻塞。性能可能优于互斥锁,但需结合退避策略优化
  • 互斥锁:线程阻塞减少CPU浪费,但上下文切换频繁时延迟显著增加。自适应锁(如Linux的pthread_mutex)可能在用户态自旋后转入阻塞,平衡性能

面试官可能想问伪共享