“自动”说明符的编译速度慢吗?

Lynn 测试交流3114字数 85阅读模式
摘要由于C++11,我们可以使用auto a=1+2而不是int a=1+2,编译器可以自己推断a的类型。它是如何工作的?编译时(更多操作)是否比声明。。。

由于C++11,我们可以使用 自动a=1+2 而不是 整数a=1+2 并且编译器推断出 a 就其本身而言。它是如何工作的?编译时(更多操作)是否比自己声明类型慢?

软件测试功能测试标准文章源自玩技e族-https://www.playezu.com/206263.html 文章源自玩技e族-https://www.playezu.com/206263.html

玩技站长微信
添加好友自动发送入群邀请
weinxin
rainbow-shownow
玩技官方公众号
官方微信公众号
weinxin
PLAYEZU
 
  • 版权提示:本站仅供存储任何法律责任由作者承担▷诈骗举报◁▷新闻不符◁▷我要投稿◁
    风险通知:非原创文章均为网络投稿真实性无法判断,侵权联系2523030730
    免责声明:内容来自用户上传发布或新闻客户端自媒体,切勿!切勿!切勿!添加联系方式以免受骗。
  • 原创转载:https://www.playezu.com/206263.html
    转载说明: 点我前往阅读>>>
评论  3  访客  3
    • Ziezi
      Ziezi 9

      它是如何工作的:

      从 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 关键字为编码器和编译器实现者带来了双赢的局面。

      • Community
        Community 9

        编译程序 知道 输入表达式(如 1 + 2)计算结果为。这就是语言的工作方式——两个操作数都是类型 智力 因此结果是 智力 也具有 自动a,您只是告诉编译器“使用初始化表达式的类型”。

        编译器不必在这里做任何额外的工作或推导。这个 car 关键字仅仅是缓解 你 从找出表达式和编写正确的类型。(你可能会弄错,可能会产生意想不到的副作用——看看这个问题(和最上面的答案)来举个例子 car 可以避免意外的运行时转换和复制。

        这个 car 关键字在迭代器中有自己的功能:

        std::vector< std::string >::const_iterator it = foo.cbegin();

        car it = foo.cbegin();

        • Community
          Community 9

          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 (特别是在循环的范围内 标准::地图&lt;std::字符串,int&gt;字典用于(自动:dict){…})最终,您将输入更多的源代码(其解析和检查需要花费大量时间),并承担更多的错误风险。正如这里所解释的,您可能会稍微猜错类型,并且由于额外的转换,显化它(稍微猜错)可能会减慢代码的执行速度。

          如果使用GCC,您可能会通过 -ftime报告 到 g++ 并获得关于各种GCC过程和阶段的时间测量。

        匿名

        发表评论

        匿名网友
        确定