回答
编译时间。在C++中,运行时类型信息在编译期间被剥离(没有RTTI或虚拟继承)。事实上,在运行时检查原始类型是不可能的。
它完全在编译时完成,没有性能差异。
auto i = 2;
编译相同
int i = 2;
在其他示例中可能存在性能差异。自动保证永远不做类型转换,所以它总是至少一样快,如果不是更快。 –
我只是想添加一些其他答案没有解决的问题。
- 每一个声明必须在编译时已知的类型,因此
auto
没有得到特殊待遇,它必须根据在编译时的类型。 - 你有点误解如何使用
auto
。是的,你可以做auto i = 2;
,它工作正常。但是,您需要auto的情况是lambda例如。拉姆达没有可定制类型(尽管您可以将其分配给std::function
)。有用的另一种情况是在类或函数模板中,要弄清楚某些操作的类型(可能有时不可能)是非常困难的,例如,当在模板类型上调用某个函数时,函数可能会返回不同的值在给定的类型上,有多种类型,这可能变得基本上不可能找出它将返回的类型。当然,您可以将函数包装在decltype
中以确定返回值,但是auto
要清晰得多。 - 人们似乎也可使用自动相当多的迭代器,因为它们的类型是一个相当痛苦写的,但我不敢肯定这是一个预期的主要用途的
auto
:+1,我喜欢你的第一和第二点,但是3.使用迭代器时需要编写代码笨拙,所以它会使代码更具可读性。 –
@pranitkothari我不是说你不应该这样做我只是说这不是为什么'auto'被添加的原因,人们早在它之前就使用迭代器 – aaronman
你说得对。 –
类型变量的声明auto
是在编译时完成的,这意味着如果你有下面的代码片段:
auto i = 10; // i is an integer
i = 3.14; // i is still an integer, will truncate to 3
香草萨特(目前负责C++标准委员会的家伙)建议“尽可能使用自动它是有用的原因有二:首先,最明显的是这是一种方便帽子让我们避免重复我们已经陈述并且编译器已经知道的类型名称。其次,当一个类型有一个未知的或无法形容的名字时,比如大多数lambda函数的类型,这不仅仅是一种便利,否则你不能轻易地拼写或者根本不能拼写。“(见他的博客中的this)。 auto
的目的是为了让开发者更容易使用,所以随时都可以使用它。
+1感谢您的联系。 –
还有第三种情况你没有描述:当类型改变但代码没有。当我们为容器开发函数时,会发生这种情况,因为它们通常具有相似或相同的接口,所以代码几乎不会改变,因此,如果我们更改类型,代码将自动适应这些更改 - 无需重新输入。汽车真的有助于在这些情况下发展。 – Fred
我确定Herb Sutter是“知道他在做什么”的C++编程。我相信,只要我使用'auto',编译器就会推导出正确的类型。然而,我不相信我总是知道编译器会推导出什么,以及它是否完全符合我的期望。因此,只要我有能力,我都会阻止使用'auto'。 (我记得有一段时间(虽然它几十年前),但是当源代码的清晰度被认为是现代和改进的时候。) – Scheff
- 1. 编译时间和运行时间?
- 2. 编译时间vs运行时间
- 3. 运行时间编译VS时间(.NET)
- 4. perl编译时间和运行时间
- 5. 是否在C++ 11中编译时或运行时自动推断类型?
- 6. 获取运行时间或编译时间细节的工具
- 7. 查看Flipper:编译时间或运行时间?
- 8. sizeof运算符编译时或运行时间
- 9. 在C++中编译时间和运行时间
- 10. 内存分配(C++)编译时间/运行时间?
- 11. 编译时间和运行时错误
- 12. C++ 11线程错误运行时间
- 13. 编译时间和运行时间之间的差异
- 14. 什么是运行时间和编译时间多态性?
- 15. 使用重载vs覆盖,编译时间vs运行时间
- 16. 平台特定库的运行时间还是编译时间?
- 17. var关键字运行时或编译时间?
- 18. 用户界面形式:添加运行时或编译时间?
- 19. 编译和运行时间类
- 20. 编译时间和运行时间的含义
- 21. 序列化检查 - 编译时间和运行时间
- 22. 编译时间与运行时间与boost :: fusion
- 23. 编译时间与运行时间依赖关系 - Java
- 24. 在Java中编译时间与运行时间?
- 25. Java库运行时间与编译时间
- 26. 编译时间和运行时间在厨师食谱
- 27. 在小部件中检查运行时间/编译时间?
- 28. “编译时间”和“运行时间”有什么区别?
- 29. 运行时间和编译时间确定的区别
- 30. 运行时间依赖性与编译时间依赖性
它根本不影响运行时性能 –
'c'和'C++'是静态的所有类型都必须在编译时知道''auto'不需要运行时类型检查,因为它是C++的一部分 – Rubens
@Rubens,除非我们处理RTTI .. – vines