2013-10-27 49 views
21
auto a = 10; 

当编译器知道aint,在编译时还是在运行时?如果它在运行时推断类型,它会不会影响性能?C++ 11自动编译时间或运行时间?

谢谢

+3

它根本不影响运行时性能 –

+13

'c'和'C++'是静态的所有类型都必须在编译时知道''auto'不需要运行时类型检查,因为它是C++的一部分 – Rubens

+4

@Rubens,除非我们处理RTTI .. – vines

回答

40

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

8

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

auto i = 2; 

编译相同

int i = 2; 
+4

在其他示例中可能存在性能差异。自动保证永远不做类型转换,所以它总是至少一样快,如果不是更快。 –

14

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

  1. 每一个声明必须在编译时已知的类型,因此auto没有得到特殊待遇,它必须根据在编译时的类型。
  2. 你有点误解如何使用auto。是的,你可以做auto i = 2;,它工作正常。但是,您需要auto的情况是lambda例如。拉姆达没有可定制类型(尽管您可以将其分配给std::function)。有用的另一种情况是在类或函数模板中,要弄清楚某些操作的类型(可能有时不可能)是非常困难的,例如,当在模板类型上调用某个函数时,函数可能会返回不同的值在给定的类型上,有多种类型,这可能变得基本上不可能找出它将返回的类型。当然,您可以将函数包装在decltype中以确定返回值,但是auto要清晰得多。
  3. 人们似乎也可使用自动相当多的迭代器,因为它们的类型是一个相当痛苦写的,但我不敢肯定这是一个预期的主要用途的auto
+3

:+1,我喜欢你的第一和第二点,但是3.使用迭代器时需要编写代码笨拙,所以它会使代码更具可读性。 –

+0

@pranitkothari我不是说你不应该这样做我只是说这不是为什么'auto'被添加的原因,人们早在它之前就使用迭代器 – aaronman

+0

你说得对。 –

5

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

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

香草萨特(目前负责C++标准委员会的家伙)建议“尽可能使用自动它是有用的原因有二:首先,最明显的是这是一种方便帽子让我们避免重复我们已经陈述并且编译器已经知道的类型名称。其次,当一个类型有一个未知的或无法形容的名字时,比如大多数lambda函数的类型,这不仅仅是一种便利,否则你不能轻易地拼写或者根本不能拼写。“(见他的博客中的this)。 auto的目的是为了让开发者更容易使用,所以随时都可以使用它。

+0

+1感谢您的联系。 –

+1

还有第三种情况你没有描述:当类型改变但代码没有。当我们为容器开发函数时,会发生这种情况,因为它们通常具有相似或相同的接口,所以代码几乎不会改变,因此,如果我们更改类型,代码将自动适应这些更改 - 无需重新输入。汽车真的有助于在这些情况下发展。 – Fred

+0

我确定Herb Sutter是“知道他在做什么”的C++编程。我相信,只要我使用'auto',编译器就会推导出正确的类型。然而,我不相信我总是知道编译器会推导出什么,以及它是否完全符合我的期望。因此,只要我有能力,我都会阻止使用'auto'。 (我记得有一段时间(虽然它几十年前),但是当源代码的清晰度被认为是现代和改进的时候。) – Scheff