我们在 C++11 中获得的新 auto 关键字对我来说看起来很模板化,所以我的问题是 - 它会导致与模板相同的编译时间膨胀吗?
关于多态 lambda 的相同问题:
[](auto val) {…}
这本质上是一个模板 lambda - 这会影响编译时间吗?
C++11的auto
关键字远没有模板那么重要——它的编译时“开销”与 的相当sizeof
,这意味着它接近于零。
与编译器需要在扩展期间执行大量计算的模板不同(C++ 中的模板语言是图灵完备的),auto
关键字要求编译器确定表达式的类型,无论如何编译器都知道这一点。事实上,即使没有关键字,它也必须弄清楚表达式的类型auto
来决定是否需要应用类型转换。
大多数人所说的“模板膨胀”是一个神话。实例化两次的模板不会产生比处理相同类型的两个单独函数更多的代码。如果您将模板实例化数千次,您将获得大量代码,但如果您编写数千个函数,您将获得相同数量的代码(请参阅饮食模板了解一些不小心定义模板可能导致一些“臃肿”的真正方法.) 模板会影响编译时间,但这不是“膨胀”。
auto
关键字不是模板,它使用与模板相同的类型推导规则,但如果你编写 auto i = 1;
只有一个“实例化”,即auto
只需要推导一种类型,它会产生完全相同的代码,int i = 1;
所以可以'不要臃肿。这只是声明变量的替代语法。零膨胀。
现在多态 lambda 不同了,它们用成员函数模板定义了一个类型operator()
,所以每次你operator()
用不同的参数类型调用闭包时,你都会实例化另一个函数模板的特化,但这与无关,auto
使用auto
只是声明模板的语法。如果您调用它数千次,您将生成大量代码,但不会超过为您使用的特定类型使用数千种不同的 lambda 表达式(几乎可以肯定,使用通用 lambda 获得的代码更少,因为只有一个闭包键入更少的 RTTI 和类型名称,以便编译器创建并存储在内存中。)