C++ “auto”说明符在编译时间上是否较慢?

C++ “auto”说明符在编译时间上是否较慢?,c++,c++11,types,auto,compile-time,C++,C++11,Types,Auto,Compile Time,由于C++11,我们可以使用autoA=1+2而不是intA=1+2,编译器可以自己推断a的类型。它是如何工作的?编译时的速度(更多操作)是否比自己声明类型慢?auto要求C++11编译器进行一些有限类型的操作(如果需要更性感的类型推断语言,请查看)。但开销仅限于编译时 如果更换auto a=1+2与inta=1+2(二者含义相同,请参阅),如果您要求编译器这样做(甚至可能不要求优化),您可能会得到相同的结果。另见 如果使用,请尝试使用g++-Wall-fverbose asm-O-S foo.

由于C++11,我们可以使用
autoA=1+2
而不是
intA=1+2
,编译器可以自己推断
a
的类型。它是如何工作的?编译时的速度(更多操作)是否比自己声明类型慢?

auto
要求C++11编译器进行一些有限类型的操作(如果需要更性感的类型推断语言,请查看)。但开销仅限于编译时

如果更换
auto a=1+2
inta=1+2(二者含义相同,请参阅),如果您要求编译器这样做(甚至可能不要求优化),您可能会得到相同的结果。另见

如果使用,请尝试使用
g++-Wall-fverbose asm-O-S foo.cc
编译一个小的C++11
foo.cc
文件,并(使用编辑器)查看生成的
foo.S
汇编文件。您将在生成的代码中看不到任何差异(但是汇编程序文件可能会有轻微的更改,例如,由于调试信息等元数据的原因)

如果您担心编译时间变慢,我想使用
auto
并不是一个决定性的因素(可能,重载在编译时间上的代价会更高)。C++11几乎被设计成实际需要大量的数据(特别是复杂的内联、不断折叠和死代码消除),并且其“解析”(尤其是头包含和模板扩展)成本高昂

使用
make-j
(或者
distcc
)的并行构建可能有助于提高总体编译时间,而不仅仅是避免
auto

如果您想要系统地避免
auto
(特别是在
std::map dict;for(auto-it:dict){
}
)这样的循环中),那么您将键入更多的源代码(其解析和检查需要花费大量时间),并且错误风险更大。如前所述,您可能猜错了类型,并且由于额外的转换,显化它(稍微错误)可能会减慢代码的执行

如果使用,您可能会将传递到
g++
,并获取有关各种GCC传递和阶段的时间度量。

它是如何工作的: 根据ISO/IEC标准:

…自动说明符是要推导的类型的占位符(7.1.6.4)。其他简单类型说明符指定 以前声明的用户定义类型或基本类型之一

7.1.6.4自动说明符
  • 自动类型说明符表示所声明变量的类型应从其初始值设定项中推导出来 或者函数声明器应该包含一个尾随返回类型
  • 自动类型说明符可能与函数声明符一起出现,该函数声明符在任何 这样的声明符有效的上下文
  • 否则,将从其初始值设定项推断变量的类型。要声明的变量的名称 不应出现在初始值设定项表达式中。在中声明变量时允许使用auto 块,在名称空间范围内和for init语句中;auto应作为decl说明符序列中的一个decl说明符出现,decl说明符序列后面应跟随一个或多个初始声明符,每个初始声明符应具有非空初始值设定项
  • 例如:

    auto x = 5; // OK: x has type int
    const auto *v = &x, u = 6; // OK: v has type const int*, u has type const int
    static auto y = 0.0; // OK: y has type double
    auto int r; // error: auto is not a storage-class-specifier
    
    速度快吗 简单的答案是是,使用它可以省略很多类型转换,但是,如果使用不当,它可能成为错误的主要来源

    在Bjarne Stroustrup的一次采访中,他说
    auto
    关键字为编码人员和编译器实现人员带来了双赢的局面

    编译器知道表达式(如
    1+2
    )计算结果的类型。这就是语言的工作方式——两个操作数都是
    int
    类型,因此结果也是
    int
    。使用
    autoa
    ,您只需告诉编译器“使用初始化表达式的类型”

    编译器不必在这里做任何额外的工作或推导。
    auto
    关键字只是让您不必计算表达式和编写正确的类型。(您可能会弄错,可能会产生意外的副作用——请参见(和)以了解
    auto
    如何避免意外的运行时转换和复制的示例


    auto
    关键字在迭代器中真正发挥作用:

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

    您是否尝试过使用和不使用
    auto
    ?相关:这是一个编译类型说明符,它不会影响运行时间。我的意思是较慢的编译时间。老实说,我怀疑这会有多大意义,因为编译器必须推断出“理想的”表达式类型,以确保它与声明的类型兼容。因此,我认为实现auto很可能是基于编译器已经在做的很多事情。
    auto
    仅在可以从表达式推断类型的情况下才合法,编译器必须确定表达式的类型,以验证assignment(到非
    auto
    )是有效的。另一方面,使用
    auto
    意味着不会发生隐式转换,编译器也不需要验证是否发生了缩小转换等。因此,
    auto
    可能编译得更快。在某些奇怪的情况下,它甚至可能在运行时更快(如果由于程序员选择的类型而进行转换)什么是<代码> Auto <代码>与编译器优化有关?<代码>自动<代码>的含义由语言规定,<代码> Auto A= 1 + 2;< /C> >完全等同于<代码> int a=1+2;< /C> >。实际上,什么?C++编译器实际上需要优化很多。是的,但是这似乎与这个问题的主题无关。通过这种方式,占位符类型(和模板/值)正被概念打磨,所以我
    auto it = foo.cbegin();