虚函数的开销

子类在覆盖(重写)父类的虚函数时,名称和参数列表必须保持一致,不然就不会发生虚函数的覆盖(重写),而是屏蔽了父类的该函数。

虚函数的调用开销

  1. 虚函数相较与普通函数,多了一次访问内存的操作,需要通过虚表指针找到虚表再调用该函数。因此虚函数的调用是一个间接调用,但这对性能的影响不是很大。
  2. 间接调用产生了一个新的问题,就是现代处理器流水线的分支预测可能会失败,这时需要重新取指,译码,运行,写回。但是现代处理器预测的成功率还是挺高的。
  3. 影响比较明显的是虚函数抑制了内联函数,这带来了较大影响。不能内联还会影响编译器做一些优化,比如常量折叠和常量传播

编译器对内联的一些优化:

  1. 消除了调用、返回、参数传递等开销
  2. 缓存更优,因为代码连续
  3. 指针消除
  4. 公共表达式消除
  5. 寄存器变量选择优化
  6. 循环展开
  7. 循环不变代码
  8. 指令重排

内联的缺点:

多个地方调用一个内联的话会使得代码量变大