【问题标题】:C++ 11 auto compile time or runtime?C++ 11 自动编译时间还是运行时?
【发布时间】:2013-11-06 06:41:19
【问题描述】:
auto a = 10;

当编译器知道aint 时,是在编译时还是在运行时?如果在运行时推断类型,会不会影响性能?

谢谢

【问题讨论】:

  • 完全不影响运行时性能。
  • cc++ 是静态类型的。所有类型必须在编译时已知。 auto 不需要运行时类型检查,因为它是 c++ 的一部分。
  • @Rubens 除非我们处理 RTTI..
  • @pranitkothari 或dynamic_cast<>
  • @pranitkothari 是的,typeiddynamic_cast<>

标签: c++ performance c++11


【解决方案1】:

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

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

Herb Sutter(目前负责 C++ 标准化委员会的人)建议“尽可能使用 auto。它之所以有用有两个原因。首先,最明显的是,它方便我们避免重复我们已经使用的类型名称“ (见this他博客上的帖子)。 auto 的预期用途是使开发人员的工作更轻松,因此请随时使用它。

【讨论】:

  • 还有第三种情况你没有描述:当类型改变但代码没有改变时。当我们为容器开发函数时会发生这种情况,因为它们经常具有相似或相同的接口,因此代码几乎不会更改,因此,如果我们更改类型,代码会自动适应这些更改 - 无需重新输入。 auto 确实有助于在这些情况下进行开发。
  • 我确信 Herb Sutter 对 C++ 编程“了解他的工作”。我确信每当我使用auto 时,编译器都会推断出正确的类型。但是,我不相信我总是知道编译器推断出什么以及它是否完全符合我的期望。因此,我尽可能避免使用auto。 (我记得有一段时间(尽管是几十年前),源代码的明确性被认为是现代和改进的。)
  • 为此睡了一晚,早上醒来突然意识到:我成了一个老式打字机……
【解决方案2】:

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

  1. 每个声明在编译时都必须有一个已知类型,因此auto 没有得到特殊处理,它必须在编译时推断出类型。
  2. 您对应该如何使用auto 有点误解。是的,你可以做auto i = 2;,它工作正常。但是,您需要 auto 的情况是例如 lambda。 lambda 没有可命名的类型(尽管您可以将其分配给 std::function)。它有用的另一种情况是在类或函数模板中,很难确定某些操作的类型(有时可能是不可能的),例如,当在模板类型上调用函数时,该函数可能返回不同的东西,具体取决于在给定的类型上,对于多种类型,基本上不可能弄清楚它将返回哪种类型。您当然可以将函数包装在 decltype 中以计算返回值,但 auto 编写起来更简洁。
  3. 人们似乎也对迭代器使用了相当多的 auto,因为它们的类型写起来很痛苦,但我不太确定这是 auto 的预期主要用途

【讨论】:

  • :+1,我喜欢你的第一点和第二点,但是 3. 使用迭代器时需要编写代码很笨拙,所以它会让代码更具可读性。
  • 并且人们错误地编写了迭代器和/或在自动之前避免使用它们。 auto 使正确的代码更容易编写
  • Herb Sutter 似乎认为为了方便起见使用auto 是可以的in the article "elements of modern c++ style"
  • @daramarak 不太确定我完全同意这一点,为什么auto i = 2 是一件好事。假设您希望它很长并且您写了它。然后你调用一个函数,它有 long 重载和 int 重载。它将选择错误的 int 重载,并且永远不会发出警告
  • 向戏剧致敬。几乎总是使用自动:herbsutter.com/2013/08/12/…
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    auto i = 2;
    

    编译相同

    int i = 2;
    

    【讨论】:

    • 在其他示例中可能存在性能差异。 auto 保证永远不会进行类型转换,所以它总是至少一样快,如果不是更快的话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2012-06-26
    • 1970-01-01
    • 2012-09-24
    • 2011-02-06
    • 2011-04-07
    • 2013-09-17
    相关资源
    最近更新 更多