阅读维基教科书 Optimizing C++ , 在 this paragraph有以下建议:
If an integer value is a constant in the application code, but is a variable in library code, make it a template parameter.
所以如果我有这样的函数
void myfunction(int param)
{
switch(param)
{
case 1:
do_something_1();
break;
case 2:
do_something_2();
break;
...
case 100: // 100 is taken as example
do_something_100();
break;
}
}
换成下面的方便吗?
template<int param> void myfunction()
{
switch(param)
{
case 1:
do_something_1();
break;
case 2:
do_something_2();
break;
...
case 100: // 100 is taken as example
do_something_100();
break;
}
}
或者完全没有必要?能解释一下原因吗?
最佳答案
只有当参数在编译时已知时,您所想到的调整才有效。在您的引述中,有一个关于您在编写库时无法做出的应用程序代码的假设。
如果您的函数调用在应用程序代码中曾经是
const int x = 3;
myfunction(1);
myfunction(2);
myfunction(x);
//etc...
它们可以重写如下。
const int x = 3;
myfunction<1>();
myfunction<2>();
myfunction<x>();
//etc...
但是如果 x
是一个变量,那是不可能的:
int x = ...; // unknown at compile-time!
myfunction<x>(); // will fail to compile!
如上所述,有些情况下您不应该在编写库时对应用程序做出假设。有时您想要或需要做。让我们考虑这样一种情况,您期望应用程序使用常量,但您不想强制它这样做。
您想针对使用常量的情况优化,但仍然允许使用变量强>.为此,我建议两种选择:
做出两种选择,一种使用模板参数,一种使用函数参数。
内联函数,因此在编译应用程序代码时,编译器可以看到函数的定义,并可用于将其优化为单个
do_something_*()
调用如果参数是常量。
请注意,这两个选项都需要将函数的定义公开给应用程序的代码。我更愿意使用第二个选项。
关于C++ 函数与带有整数参数的模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15108444/