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