【问题标题】:Is portability a concern with auto?便携性与汽车有关吗?
【发布时间】:2015-03-20 18:11:09
【问题描述】:

auto 很有用,因为您不必写出类型。但我想知道的是,为auto 推导出的类型是否会影响类型可能不同的系统上的程序结果。我在任何地方都使用auto 编写的程序是否可以移植,还是我仍然需要手动担心类型?

【问题讨论】:

  • 在使用 auto stackoverflow.com/questions/5070521/…时我会更担心 const 和 reference
  • 是的,您必须在某种程度上继续担心。例如,您通常可以在具有 32b int 且一切正常的平台上进行测试和运行。然后你的代码被移植到一个有 16b int 的平台上,突然你的循环不再做你想要的,因为你的循环计数器以一种意想不到的方式滚动。这样的事情可能很少会咬你,但有可能。
  • 我想说,auto 推导出的类型在不同的系统上会有所不同,这可以提高可移植性。如果你正确使用它。

标签: c++ c++11 auto


【解决方案1】:

如果您的类型需要特定的或最小的大小,您可能需要使用来自<stdint.h> 的那些类型,否则auto 不应该存在可移植性问题。

【讨论】:

  • intunsigned int 相比,涉及更大/更小/相同大小的类型的整数提升有何怪癖?
  • 要补充一点,你不应该使用 auto 因为它可以让你忽略类型或节省一些击键,你应该使用 auto 因为让你的代码更正确并在你的文件中记录类型的意图代码。 Herb Sutter 详细介绍了这个 here.
【解决方案2】:

auto 的结果是否可移植?好吧,让我们举个简单的例子:

auto i = 123456;

这会在任何地方编译吗?是的。是不是到处都是一样的意思?不会。在 16 位系统上,这会将 i 声明为 long。那是问题吗?并不真地。事实上,它恰好通过在需要的地方声明一个更大的类型来帮助可移植性。但这只是运气:

auto i = 192 * 643;

溢出,虽然它在数学上是一样的。

在第二个示例中,您不知道std::vector<int>::iterator 的实际类型是什么,因此auto i = myVec.begin() 具有未知类型。而且这种类型在编译器之间会有所不同。但同样,这些都是无关紧要的细节。重要的是i 可用于迭代(和更改)myVec

【讨论】:

    猜你喜欢
    • 2019-06-13
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多