除了简化的通用算法之外,模板在类层次结构上是否有任何好处?例如,在类层次结构中使用模板是否更有效?模板受到程序员对金融工具的高度赞扬,但我并不理解为什么。
答案 0 :(得分:5)
当需要速度时,我们使用模板而不是运行时动态多态,模板可能提供编译时多态(在编译时解析)而没有虚拟方法查找开销。
来自wikipedia:
Polymorphism是一个通用的标准编程工具 对象可以用作其基础对象的实例但是在哪里 将调用派生对象的方法,其中所有的调用都是 虚方法将是派生程度最高的类。这个 动态多态行为(通常)由 使用虚方法为类创建virtual look-up tables, 在运行时遍历的表以标识要生成的方法 调用。因此,运行时多态性必然需要执行 开销(虽然在现代架构上,开销可以忽略不计)。 但是,在许多情况下,所需的多态行为是不变的 并且可以在编译时确定。然后Curiously Recurring Template Pattern (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
将在运行时计算。但是使用模板编写
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
在编译时计算,不会产生运行时开销。
答案 1 :(得分:5)
模板与类层次结构
主要是虚拟函数调用的成本。如果函数的实际工作量的计算成本很小,那么虚拟调度的成本可能很高。与内联函数相比,尤其是在紧密循环内使用时。 使用运行时多态性排除函数内联的可能性。
C ++模板是一个非常强大的工具......
除了您在C ++标准库中找到的众所周知的通用容器和算法外,C ++模板还支持一系列高级技术,例如:
基本上,您正在编译编译器以构建所需的类。使用得当,这可以提供高度可重用的最佳代码。如果误用,它可以提供比更合适的方法更臃肿的对象代码。