Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么要将值传递给模板而不是在函数调用中提供它? 当我学习C++时,有一个概念,我不能完全理解和理解力学背后的推理。这个主题是:函数模板和在编译时传递参数,而不是在运行时_C++_Templates - Fatal编程技术网

为什么要将值传递给模板而不是在函数调用中提供它? 当我学习C++时,有一个概念,我不能完全理解和理解力学背后的推理。这个主题是:函数模板和在编译时传递参数,而不是在运行时

为什么要将值传递给模板而不是在函数调用中提供它? 当我学习C++时,有一个概念,我不能完全理解和理解力学背后的推理。这个主题是:函数模板和在编译时传递参数,而不是在运行时,c++,templates,C++,Templates,我想知道的是,在编译时传递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 <&

我想知道的是,在编译时传递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';
}
#包括
使用名称空间std;
模板
T固定乘法(T val)
{
返回val*N;
}
int main(){

std::cout有时,当其中一个操作数是已知常量时,可能会进行更多优化


例如,在x86体系结构上,可以使用运行速度比IMUL快得多的
LEA
指令实现乘(常数)3。将无符号整数变量除以2的常数幂可以用右位移位(以及按位和进行模运算)代替.

想象一下,你必须将一个向量的所有元素乘以2,然后你就有了一个算法,可以变换向量的所有元素

该算法可以使用一个接受一个参数的函数进行自定义


但是你有一个乘法函数,它需要参数……因此你可以将一个参数绑定到一个联系人(在编译时),并有效地创建一个单参数函数

这是人们传递整数值或浮点值(很少)的主要原因作为模板参数,这是因为它们在问题中代表不同的类型,并且它们希望有可重用的方法和算法来处理这些类型

从设计角度来看,以签出为例。这是一个设计用于支持n维数组的系统。因此,本质上,当您定义

typedef boost::multi_array<double, 3> array_3d;
typedef boost::multi_array<double, 2> array_2d;
typedef boost::multi_array_3d;
typedef boost::multi_array_2d;
它们是两种完全不同的类型。有人可以编写一个特殊的迭代器,该迭代器接受一个
多_数组
,而不必为2d和3d情况重新定义它


可能有一些代码库按照您列出的方式优化了它们的函数,但这些都是例外。优化不是模板化任何东西的主要动机,而是拥有一个模块化的、可重用的、通用的代码。

模板在编译时实例化,在编译时计算的越多,计算的工作量就越小在运行时(因此您的程序应该运行得更快).是的,但我认为模板的作用是防止冗余编码。除非设计师想在防止冗余的基础上增加另一个功能,否则优化?看看
模板元编程
;这真的让它发挥到了极致。例如,你可以在它出现之前计算程序的输出通过使用模板运行。模板将执行您告诉他们执行的任何操作!对于一个可能更好的示例,假设您使用了许多正则表达式。这些表达式都可以在编译时使用Boost.Xpressive进行解析,而不是每次程序启动时进行解析。这节省了启动时间并添加了良好的编译时错误检查。因此,其背后的原因是是否允许为较低级别的优化提供更多选项?@user3435157:我只能告诉你这种方法的优点,我无法深入设计师的头脑并告诉你他的理由。感谢你确认它确实提高了机器级别的性能。你的描述是最详细的helpful@user3435157嗯,我得说是适应了APIsnice示例的ion..不需要调用第二个参数x次,您可以拥有一个只需要1个参数的函数,这可能会节省大量资源..作为模板参数浮动不是标准功能。