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

Pra*_*ari 25 c++ performance c++11

auto a = 10;
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Siy*_*Ren 51

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


aar*_*man 18

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

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

  • :+ 1,我喜欢你的第一点和第二点,但是3.使用迭代器时代码需要编写是笨拙的,所以它会使代码更具可读性. (4认同)
  • 并且人们在自动之前错误地编写了迭代器和/或避免使用它们.auto使正确的代码更容易编写 (3认同)
  • Herb Sutter似乎认为可以使用`auto`来实现方便[在文章"现代c ++风格的元素"中](http://herbsutter.com/elements-of-modern-c-style/) (3认同)
  • @daramarak 不太确定我完全同意这一点,为什么`auto i = 2` 是一件好事。假设您希望它很长并且您写了它。然后你调用一个重载 long 和重载 int 的函数。它将选择错误的 int 重载,并且永远不会发出警告 (2认同)
  • 关于第 3 点,我将直接引用 Bjarne 的书 TC++PL4,“使用 auto,我们可以避免冗余和编写长类型名称。这在泛型编程中尤其重要,因为在泛型编程中,可以确定对象的确切类型。程序员很难知道,而且类型名称可能会很长”。这解决了两个问题,即 1) 预期目的,即类型未知的情况,以及 2) 避免长类型名称的附带好处。 (2认同)

vin*_*nes 9

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

auto i = 2;
Run Code Online (Sandbox Code Playgroud)

编译相同

int i = 2;
Run Code Online (Sandbox Code Playgroud)

  • 在其他示例中,可能存在性能差异.auto保证永远不会进行类型转换,所以它总是至少同样快,如果不是更快. (5认同)

Ras*_*ban 7

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

auto i = 10; // i is an integer
i = 3.14; // i is still an integer, will truncate to 3
Run Code Online (Sandbox Code Playgroud)

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