首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时使用模板而不是派生类

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

Stack Overflow用户
提问于 2013-07-21 20:42:49
回答 2查看 1.3K关注 0票数 1

除了简化的泛型算法之外,模板在类层次结构上还有什么好处吗?例如,在类层次结构中使用模板是否更有效?模板被程序员高度赞扬为金融工具,但我真的不明白为什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-21 21:44:52

模板与类层次结构

最主要的是虚函数调用的开销。如果函数的实际工作的计算成本很小,则虚拟调度的成本可能很大。与内联函数相比,尤其是这种情况,如果在紧密循环中使用的话。使用运行时多态性可以排除内联函数的可能性。

C++模板是一个非常强大的工具,可以让...

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

  • Policy based design
  • Template meta-programming

从本质上讲,你是在编写编译器来构建你想要的类。如果使用得当,这可以提供高度可重用的优化代码。如果使用不当,它会比更合适的方法提供更多臃肿的目标代码。

票数 5
EN

Stack Overflow用户

发布于 2013-07-21 21:16:05

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

来自wikipedia

Polymorphism是一种常见的标准编程工具,其中派生对象可以用作其基对象的实例,但派生对象的方法将被调用,其中所有虚方法的调用都将是派生最多的类的方法。这种动态多态行为(通常)是通过为具有虚方法的类创建virtual look-up tables来获得的,虚方法是在运行时被遍历以标识要调用的方法的表。因此,运行时多态性必然会带来执行开销(尽管在现代体系结构上,开销可以忽略不计)。然而,在许多情况下,所需的多态行为是不变的,并且可以在编译时确定。然后,可以使用Curiously Recurring Template Pattern (CRTP)来实现静态多态性,这是对编程代码中的多态性的模仿,但在编译时会得到解决,从而消除了运行时的虚拟表查找。

另一个例子是模板在编译时计算的能力,例如众所周知的阶乘,通常写成这样

代码语言:javascript
复制
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 

是在运行时计算的。但使用模板编写

代码语言:javascript
复制
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

是在编译时计算的,因此不会产生运行时开销。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17772470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档