随着我学习C ++,有一个概念,我无法完全掌握和理解力学背后的推理。那个主题是:函数模板和在编译时传递参数,而不是运行时。
我想知道的是,在编译时传递--lets的值的设计背后的原因 - 例如 - 一个int值。我认为C ++的开发人员可能已经允许在运行时传递价值,但我想知道的是 - 选择传递值的原因,让在编译期间说一个int。当然,我正在谈论像这样的功能模板:
#include <iostream>
using namespace std;
template <class T, int N>
T fixed_multiply (T val)
{
return val * N;
}
int main() {
std::cout << fixed_multiply<int,2>(10) << '\n';
std::cout << fixed_multiply<int,3>(10) << '\n';
}
据我所知,在编译时计算调用模板函数(在这种情况下为&lt; 2&gt;和&lt; 3&gt;)中分配的int值。设计这些机制背后的原因是什么?我理解它是为每个函数创建一个不同的实例,一个乘以2,另一个乘以3。因此,它不能传递变量,必须传递一个常量。
但为什么这有必要呢?我觉得设计师可以允许运行时执行,因此传递给它的值可能是变量,但显然设计师认为这样做会更好。
感谢。
答案 0 :(得分:2)
当其中一个操作数是已知常量时,有时可以进行更多优化。
例如,在x86架构上,可以使用LEA
指令实现乘以(常量)3,该指令的运行速度比IMUL
快得多。用2的常数幂对无符号整数变量进行除法可以用右移位(和按位与模的模数)代替。
答案 1 :(得分:1)
想象一下,你必须将两个向量的所有元素相乘,并且你有一个算法可以转换向量的所有元素。
可以使用一个参数
的函数自定义算法但是你有多个参数...所以你可以将一个参数绑定到一个联系人(在编译时)并有效地创建一个参数函数
答案 2 :(得分:1)
有人传递整数值或浮点值(很少)或者作为模板arg的主要原因是因为它们在问题中代表不同的类型。他们希望有可重用的方法和算法来运行这些类型。
从设计的角度来看,结帐Boost Multi Array为例。这是一个旨在支持n维数组的系统。所以当你定义时,
typedef boost::multi_array<double, 3> array_3d;
typedef boost::multi_array<double, 2> array_2d;
他们是两种完全不同的类型。有人可以编写一个特殊的迭代器,它需要multi_array<type, int>
,而不必为2d和3d情况重新定义它。
可能存在以您列出的方式优化其功能的代码库,但这些是例外情况。优化并不是模板化任何东西的主要动机,但具有模块化,可重用的通用代码。