第8章

  1. 尽管从绝对数值上看并不昂贵(最多几纳秒),但虚函数调用比非虚函数调用要慢数倍,并且可能比内联函数调用慢一个数量级甚至更多。这种开销来源于间接寻址:虚函数总是通过函数指针调用,实际调用的函数在编译时未知,因此无法内联。
  2. 如果编译器能够确定将要调用的确切函数,就可以优化掉这种间接寻址,并可能将函数内联。
  3. 正如运行时多态调用是通过指向基类的指针进行的一样,静态多态调用也必须通过指向基类的指针或引用来实现。在CRTP(奇异递归模板模式)和静态多态的情况下,基类类型实际上是基类模板为每个派生类生成的一组类型。为了进行多态调用,必须使用一个函数模板,该模板可以针对这些基类类型中的一个进行实例化。
  4. 当直接调用派生类时,CRTP 的使用与虚函数的编译时等价形式有很大不同。此时,成为一种实现技术,为多个派生类提供通用功能,而每个派生类则扩展并定制基类模板的接口。
  5. 使用多个 CRTP 基类并不需要新的机制:派生类可以继承自多个这样的基类类型,每个类型都是 CRTP 基类模板的一个实例化。然而,将这些基类与各自正确的模板参数(即派生类自身)一起列出会变得繁琐。更简单且不易出错的方法是,将派生类声明为带有双重模板参数的变长模板,并在整个参数包中进行继承。