32
auto a = 10;

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

谢谢

4

4 回答 4

59

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

于 2013-10-27T13:52:59.167 回答
20

我只是想添加一些其他答案没有解决的东西。

  1. 每个声明在编译时都必须有一个已知的类型,因此auto不会得到特殊处理,它必须在编译时推断出类型。
  2. 你有点误解了auto应该如何使用。是的,您可以这样做auto i = 2;,而且效果很好。但是,您需要 auto 的情况是例如 lambda。lambda 没有可命名的类型(尽管您可以将其分配给std::function)。另一种有用的情况是在类或函数模板中,很难确定某些操作的类型(有时可能是不可能的),例如,当在模板类型上调用函数时,该函数可能会返回不同的东西,具体取决于在给定的类型上,对于多种类型,基本上不可能弄清楚它将返回哪种类型。您当然可以将函数包装在 adecltype中以计算返回值,但auto编写起来更简洁。
  3. 人们似乎也对迭代器使用了相当多的 auto ,因为它们的类型写起来很痛苦,但我不太确定这是预期的主要用途auto
于 2013-10-27T20:24:31.187 回答
9

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

auto i = 2;

编译相同

int i = 2;
于 2013-10-27T13:49:32.877 回答
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。它之所以有用有两个原因。首先,最明显的是,它方便我们避免重复我们已经说过的类型名称和“ (见他博客上的这篇文章)的预期用途auto是使开发人员的工作更轻松,所以只要它看起来合适,就可以随意使用它。

于 2013-10-29T00:02:16.477 回答