由于C++11,我们可以使用 自动a=1+2
而不是 整数a=1+2
并且编译器推断出 a
就其本身而言。它是如何工作的?编译时(更多操作)是否比自己声明类型慢?
软件测试功能测试标准文章源自玩技e族-https://www.playezu.com/206263.html 文章源自玩技e族-https://www.playezu.com/206263.html
由于C++11,我们可以使用 自动a=1+2
而不是 整数a=1+2
并且编译器推断出 a
就其本身而言。它是如何工作的?编译时(更多操作)是否比自己声明类型慢?
软件测试功能测试标准文章源自玩技e族-https://www.playezu.com/206263.html 文章源自玩技e族-https://www.playezu.com/206263.html
未知地区 3F
它是如何工作的:
从 ISO/IEC:
…自动说明符是要推导的类型的占位符(7.1.6.4)。其他简单类型说明符指定
以前声明的用户定义类型或基本类型之一。。。
7.1.6.4自动说明符
自动类型说明符表示所声明变量的类型应从其初始值设定项中推导出来
或者函数声明器应包括尾部返回类型。
自动类型说明符可能与函数声明符一起出现,该函数声明符在任何情况下都具有尾部返回类型
这种声明符有效的上下文。
否则,变量的类型将从其初始值设定项中推导出来。要声明的变量的名称
不应出现在初始值设定项表达式中。在数据库中声明变量时允许使用car
块,在命名空间范围和for init语句中;car应作为decl说明符序列中的一个decl说明符出现,decl说明文序列后应跟随一个或多个initDeclarator,每个initDeclator应具有非空的初始值设定项。。。
例子:
car x = 5; // OK: x has type int
const car *v = &x, u = 6; // OK: v has type const int*, u has type const int
static car y = 0.0; // OK: y has type double
car int r; // error: car is not a storage-class-specifier
它更快吗:
简单的答案是 对,通过使用它,可以省略许多类型转换,但是,如果使用不当,它可能成为错误的主要来源。
在比亚恩·斯特劳斯特普的一次采访中,他说: car 关键字为编码器和编译器实现者带来了双赢的局面。
未知地区 2F
编译程序 知道 输入表达式(如 1 + 2)计算结果为。这就是语言的工作方式——两个操作数都是类型 智力 因此结果是 智力 也具有 自动a,您只是告诉编译器“使用初始化表达式的类型”。
编译器不必在这里做任何额外的工作或推导。这个 car 关键字仅仅是缓解 你 从找出表达式和编写正确的类型。(你可能会弄错,可能会产生意想不到的副作用——看看这个问题(和最上面的答案)来举个例子 car 可以避免意外的运行时转换和复制。
这个 car 关键字在迭代器中有自己的功能:
std::vector< std::string >::const_iterator it = foo.cbegin();
对
car it = foo.cbegin();
未知地区 1F
car 正在询问C++11 编译程序 做一些 有限的 一种类型推断(如果您想要更性感的类型推断语言,请查看Ocaml)。但开销仅限于编译时。
如果你更换 自动a=1+2; 具有 int a=1+2; (二者含义相同,请参见simplicis的答案),如果您要求编译器进行优化(甚至可能不要求优化),您可能会得到相同的机器代码。另见此。
如果使用GCC,请尝试编译一个小型C++11 foo.cc 存档 g++-Wall-fverbose asm-O-S foo.cc 并(使用编辑器)查看生成的 福斯 汇编程序文件。您在生成的代码中看不到任何差异(但汇编文件可能会略有变化,例如,由于调试信息等元数据的原因)
如果你关心 较慢的编译时间 我想,使用 car 不是一个决定性因素(可能重载在编译时间上花费更大)。C++11的设计几乎可以满足实际需要 要求 大量优化(特别是复杂的内联、不断折叠和死代码消除)及其“解析”(尤其是标头包含和模板扩展)成本高昂。
使用 make-j (也许 卡切 或 distcc)这可能有助于提高总体编译时间,而不仅仅是避免 car.
如果你想系统地避免 car (特别是在循环的范围内 标准::地图<;std::字符串,int>;字典用于(自动:dict){…})最终,您将输入更多的源代码(其解析和检查需要花费大量时间),并承担更多的错误风险。正如这里所解释的,您可能会稍微猜错类型,并且由于额外的转换,显化它(稍微猜错)可能会减慢代码的执行速度。
如果使用GCC,您可能会通过 -ftime报告 到 g++ 并获得关于各种GCC过程和阶段的时间测量。