auto对编译时间的影响
The effect of auto on compile time
我们在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和类型名称更少。)
- C++为构建时间获取QDateTime的可靠方法
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 从持续时间构造std::chrono::system_clock::time_point
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 使用简单类型列表实现的指数编译时间.为什么
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 先前循环迭代对当前迭代执行时间的影响
- 可传递值影响递归算法的渐近时间复杂性
- 以前的代码似乎会影响以后函数调用的时间
- 模板实例化对编译持续时间的影响
- auto对编译时间的影响
- 同一类型的多个声明是否会影响编译时间
- c++本地时间,不受夏令时使用boost的影响
- 名称空间别名会影响大型代码库中的构建时间吗?(c++)
- 变量声明如何影响执行时间
- 施力无效后,受影响的身体已经静止了一段时间
- 注释会影响编译时间吗?
- MPI时间测量受到其他用户的影响
- 在读取文件时,缓冲区大小会影响时间成本吗