C++ c++;模板可变代码效率

C++ c++;模板可变代码效率,c++,templates,C++,Templates,考虑一个模板函数(带有基本模板变量,即非类、非结构模板变量): #包括 模板 int f(){ 返回m+n; } int main(){ 对于(int i=0;i,如果编译器足够聪明,可以推断循环是constepr,那么它很可能会展开循环并内联函数体 但是,当您尝试使用gcc时,会出现以下错误: test.cc:230:21: error: the value of 'i' is not usable in a constant expression std::cout << f

考虑一个模板函数(带有基本模板变量,即非类、非结构模板变量):

#包括
模板
int f(){
返回m+n;
}
int main(){

对于(int i=0;i,如果编译器足够聪明,可以推断循环是
constepr
,那么它很可能会展开循环并内联函数体

但是,当您尝试使用gcc时,会出现以下错误:

test.cc:230:21: error: the value of 'i' is not usable in a constant expression
  std::cout << f < i, j > () << endl;
test.cc:230:21:错误:“i”的值在常量表达式中不可用
std::cout()>a;
f();
编译器无法做出此编译时决策,并发出投诉


除了这些明显的问题外,我认为您的问题是编译器是否会为具有不同参数的模板实例化发出多个代码副本。一般来说,答案是。然而,现代编译器有聪明的方法

  • 检查模板参数是否等效并导致相同的代码
  • 通过识别相同的部分并删除所有副本来折叠二进制代码
gcc开发人员的这个博客对gcc5的功能进行了很好的总结

test.cc:230:21: error: the value of 'i' is not usable in a constant expression
  std::cout << f < i, j > () << endl;
std::cin >> a;
f< a, 2 >();