Pla*_*men 1 c++ comparison templates derived-class
除了简化的通用算法之外,模板在类层次结构上是否有任何好处?例如,在类层次结构中使用模板是否更有效?模板受到程序员对金融工具的高度赞扬,但我并不理解为什么.
当需要速度时,我们使用模板而不是运行时动态多态,模板可能提供编译时多态(在编译时解析)而没有虚拟方法查找开销.
来自维基百科:
多态性是一种常见的标准编程工具,其中派生对象可以用作其基础对象的实例,但是将调用派生对象的方法,其中所有虚拟方法的调用都是最派生类的调用.这种动态多态行为(通常)通过为具有虚方法的类创建虚拟查找表来获得,这些表在运行时遍历以标识要调用的方法.因此,运行时多态性必然需要执行开销(尽管在现代架构上,开销可以忽略不计).但是,在许多情况下,所需的多态行为是不变的,可以在编译时确定.然后,可以使用奇怪的重复模板模式(CRTP)来实现静态多态,这是编程代码中的多态性模仿,但是在编译时解析,因此不需要运行时虚拟表查找.
另一个例子是模板在编译时计算的能力,例如通常像这样编写的众所周知的阶乘
unsigned int factorial(unsigned int n) {
return (n==0)? 1 : n * factorial(n-1);
}
const int x = factorial(4); // == (4 * 3 * 2 * 1 * 1) == 24
const int y = factorial(0); // == 0! == 1
Run Code Online (Sandbox Code Playgroud)
是在运行时计算的.但是使用模板编写
template <int N>
struct Factorial {
enum { value = N * Factorial<N - 1>::value };
};
template <>
struct Factorial<0> {
enum { value = 1 };
};
// Factorial<4>::value == 24
// Factorial<0>::value == 1
const int x = Factorial<4>::value; // == 24
const int y = Factorial<0>::value; // == 1
Run Code Online (Sandbox Code Playgroud)
在编译时计算,不会产生运行时开销.