除了简化的泛型算法之外,模板在类层次结构上还有什么好处吗?例如,在类层次结构中使用模板是否更有效?模板被程序员高度赞扬为金融工具,但我真的不明白为什么。
发布于 2013-07-21 21:44:52
模板与类层次结构
最主要的是虚函数调用的开销。如果函数的实际工作的计算成本很小,则虚拟调度的成本可能很大。与内联函数相比,尤其是这种情况,如果在紧密循环中使用的话。使用运行时多态性可以排除内联函数的可能性。
C++模板是一个非常强大的工具,可以让...
除了您在C++标准库中找到的众所周知的通用容器和算法之外,C++模板还支持一系列高级技术,例如:
从本质上讲,你是在编写编译器来构建你想要的类。如果使用得当,这可以提供高度可重用的优化代码。如果使用不当,它会比更合适的方法提供更多臃肿的目标代码。
发布于 2013-07-21 21:16:05
当需要速度时,我们使用模板而不是运行时动态多态性,并且模板可以提供编译时多态性(在编译时解析),而不需要虚拟方法查找开销。
来自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是在编译时计算的,因此不会产生运行时开销。
https://stackoverflow.com/questions/17772470
复制相似问题