C ++ 11自动编译时间还是运行时?

时间:2013-10-27 13:47:23

标签: c++ performance c++11

auto a = 10;

编译器在编译时或运行时知道aint吗?如果它在运行时推断类型,是否会影响性能?

由于

4 个答案:

答案 0 :(得分:49)

编译时间。在C ++中,运行时类型信息在编译期间被剥离(没有RTTI或虚拟继承)。实际上,在运行时检查基元类型是不可能的。

答案 1 :(得分:17)

我只是想补充一些其他答案没有解决的问题。

  1. 每个声明在编译时必须具有已知类型,因此auto不会得到特殊处理,它必须在编译时推断出类型。
  2. 你有点误解了应该如何使用auto。是的,你可以做auto i = 2;,它运作正常。但是你需要auto的情况就是lambda。 lambda没有namable类型(尽管你可以将它分配给std::function)。另一种有用的情况是在类或函数模板中,很难弄清楚某些操作的类型(有时可能是不可能的),例如,当在模板类型上调用函数时,该函数可能会返回不同的函数。在给定的类型上,有多种类型,这基本上不可能确定它将返回哪种类型。你当然可以将函数包装在decltype中来计算返回值,但auto写得更清晰。
  3. 人们似乎也使用auto来进行迭代,因为它们的类型很难写,但我不确定这是auto的主要用途

答案 2 :(得分:9)

它完全在编译时完成,没有性能差异。

auto i = 2;

编译与

相同
int i = 2;

答案 3 :(得分:7)

声明为auto的变量的类型在编译时完成,这意味着如果您有以下代码片段:

auto i = 10; // i is an integer
i = 3.14; // i is still an integer, will truncate to 3

Herb Sutter(目前负责C ++标准化委员会的人)建议“尽可能使用auto。它有两个原因。首先,最明显的是它方便我们避免重复我们已经输入的类型名称声明并且编译器已经知道了。其次,当一个类型具有未知或不可知的名称(例如大多数lambda函数的类型)时,它不仅仅是一种方便,你不能轻易拼写或根本不能拼写。“ (请参阅他的博客上的this帖子)。 auto的用途是让开发人员更容易使用,所以只要看起来合适,就可以随意使用它。