auto对编译时间的影响

The effect of auto on compile time

本文关键字:影响 时间 编译 auto      更新时间:2023-10-16

我们在C++11中获得的新auto关键字对我来说很模板化,所以我的问题是——它会像模板一样导致编译时膨胀吗?

关于多态lambdas的相同问题:

 [](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和类型名称更少。)