C++ 何时使用模板而不是派生类
除了简化的泛型算法外,模板相对于类层次结构有什么好处吗?例如,在类层次结构上使用模板是否更有效?模板在金融工具方面受到程序员的高度赞扬,但我真的不明白为什么。当速度是必需的时候,我们使用模板而不是运行时动态多态性,并且模板可能提供编译时多态性(在编译时解决),而没有虚拟方法查找开销 发件人: 是一种通用的标准编程工具,其中 对象可以用作其基础对象的实例,但 将调用派生对象的方法,其中 虚拟方法将是那些派生最多的类。这 动态多态行为(通常)由 为具有虚拟方法的类创建, 在运行时遍历以标识要访问的方法的表 调用。因此,运行时多态性必然需要执行 开销(尽管在现代建筑中,开销可以忽略不计)。 然而,在许多情况下,所需的多态性行为是不变的 并且可以在编译时确定。然后可以使用, 这是对编程代码中多态性的模仿,但是 在编译时解析,因此不需要运行时 虚拟表查找C++ 何时使用模板而不是派生类,c++,templates,comparison,derived-class,C++,Templates,Comparison,Derived Class,除了简化的泛型算法外,模板相对于类层次结构有什么好处吗?例如,在类层次结构上使用模板是否更有效?模板在金融工具方面受到程序员的高度赞扬,但我真的不明白为什么。当速度是必需的时候,我们使用模板而不是运行时动态多态性,并且模板可能提供编译时多态性(在编译时解决),而没有虚拟方法查找开销 发件人: 是一种通用的标准编程工具,其中 对象可以用作其基础对象的实例,但 将调用派生对象的方法,其中 虚拟方法将是那些派生最多的类。这 动态多态行为(通常)由 为具有虚拟方法的类创建, 在运行时遍历以标识要访问的方
另一个例子是模板在编译时计算的能力,例如众所周知的factorial,通常是这样写的
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
模板
结构阶乘{
枚举{value=N*阶乘::值};
};
模板
结构阶乘{
枚举{值=1};
};
//阶乘::值==24
//阶乘::值==1
常量int x=阶乘::值;//==24
常量int y=阶乘::值;//==1.
是在编译时计算的,不会产生运行时开销。当速度是必需的时,我们使用模板而不是运行时动态多态性,并且模板可能提供编译时多态性(在编译时解决),而没有虚拟方法查找开销 发件人: 是一种通用的标准编程工具,其中 对象可以用作其基础对象的实例,但 将调用派生对象的方法,其中 虚拟方法将是那些派生最多的类。这 动态多态行为(通常)由 为具有虚拟方法的类创建, 在运行时遍历以标识要访问的方法的表 调用。因此,运行时多态性必然需要执行 开销(尽管在现代建筑中,开销可以忽略不计)。 然而,在许多情况下,所需的多态性行为是不变的 并且可以在编译时确定。然后可以使用, 这是对编程代码中多态性的模仿,但是 在编译时解析,因此不需要运行时 虚拟表查找
另一个例子是模板在编译时计算的能力,例如众所周知的factorial,通常是这样写的
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
模板
结构阶乘{
枚举{value=N*阶乘::值};
};
模板
结构阶乘{
枚举{值=1};
};
//阶乘::值==24
//阶乘::值==1
常量int x=阶乘::值;//==24
常量int y=阶乘::值;//==1.
在编译时计算,不会产生运行时开销。模板与类层次结构 主要问题是虚拟函数调用的成本。如果函数的实际工作的计算成本很小,那么虚拟调度的成本可能很大。与内联函数相比,如果在紧循环中使用,情况尤其如此。 使用运行时多态性排除了函数内联的可能性 C++模板是一个非常强大的工具…… 随着C++ C++标准库中已知的通用容器和算法的出现,C++模板支持一系列高级技术,如:
本质上,您正在对编译器进行编程,以构建所需的类。如果使用得当,这可以提供高度可重用的最佳代码。如果使用不当,它可能会产生比更合适的方法更臃肿的目标代码 模板与类层次结构 主要问题是虚拟函数调用的成本。如果函数的实际工作的计算成本很小,那么虚拟调度的成本可能很大。与内联函数相比,如果在紧循环中使用,情况尤其如此。 使用运行时多态性排除了函数内联的可能性 C++模板是一个非常强大的工具…… 随着C++ C++标准库中已知的通用容器和算法的出现,C++模板支持一系列高级技术,如:
本质上,您正在对编译器进行编程,以构建所需的类。如果使用得当,这可以提供高度可重用的最佳代码。如果使用不当,它可能会产生比更合适的方法更臃肿的目标代码 嗯,你能举个例子说明你不确定该用什么吗?一般来说,模板和派生类是完全不同的东西,尽管它们有很大的重叠。我不太明白你想要比较什么。如何用(单个)模板类替换类层次结构?模板类和类层次结构是完全不同的工具,用于实现不同的目标。