何时使用模板而不是派生类

时间:2013-07-21 12:42:49

标签: c++ templates comparison derived-class

除了简化的通用算法之外,模板在类层次结构上是否有任何好处?例如,在类层次结构中使用模板是否更有效?模板受到程序员对金融工具的高度赞扬,但我并不理解为什么。

2 个答案:

答案 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 ++模板还支持一系列高级技术,例如:

基本上,您正在编译编译器以构建所需的类。使用得当,这可以提供高度可重用的最佳代码。如果误用,它可以提供比更合适的方法更臃肿的对象代码。