1

除了简化的通用算法之外,模板对类层次结构有什么好处吗?例如,在类层次结构上使用模板是否更有效?模板作为金融工具受到程序员的高度评价,但我真的不明白为什么。

4

2 回答 2

5

模板与类层次结构

最主要的是虚函数调用的成本。如果函数的实际 wok 的计算成本很小,那么虚拟调度的成本可能会很大。与内联函数相比,如果在紧密循环中使用,情况尤其如此。使用运行时多态性排除了函数被内联的可能性。

C++模板是一个非常强大的工具...

除了 C++ 标准库中众所周知的通用容器和算法外,C++ 模板还支持一系列高级技术,例如:

本质上,您正在对编译器进行编程以构建您想要的类。使用得当,这可以提供高度可重用的最佳代码。如果使用不当,它可能会提供比更合适的方法更臃肿的目标代码。

于 2013-07-21T13:44:52.043 回答
5

当需要速度并且模板可能提供编译时多态性(在编译时解决)时,我们使用模板而不是运行时动态多态性,而无需虚拟方法查找开销。

来自维基百科

多态是一种通用的标准编程工具,派生对象可以用作其基对象的实例,但派生对象的方法将被调用,其中所有虚拟方法的调用将是最派生类的调用。这种动态多态行为(通常)是通过为具有虚拟方法的类创建虚拟查找表来获得的,这些表在运行时被遍历以识别要调用的方法。因此,运行时多态性必然需要执行开销(尽管在现代架构上,开销可以忽略不计)。然而,在许多情况下,所需的多态行为是不变的,可以在编译时确定。然后是奇怪重复的模板模式(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

在编译时计算,不施加运行时开销。

于 2013-07-21T13:16:04.867 回答