【问题标题】:Most convenient integer type for processor处理器最方便的整数类型
【发布时间】:2012-02-02 14:57:46
【问题描述】:

据我所知,不是处理器字长整数值在修改它们时将被提升(使用+ , -, &, ETC)。 long 类型应该是字长。在我的编译器上,int32 位long64 位

这是否意味着longint效率更高,尽管需要更多内存?

还有一件事,复合运算符是否也促进了价值观?那么 incrementdecrement 运算符呢?

【问题讨论】:

  • 我不是 100% 相信这一点,但我认为现在大多数常见的处理器都有 32 位和 64 位操作模式,所以如果你有两个 int32s,它可能最终会在同时(因为它可以)但分开使用它们。也就是说,不需要升职。就像我说的,我不太确定。
  • 复合运算符有+=-=
  • @MarkB 我知道。我只是想知道这些是否也需要促销。虽然,这也可能取决于我认为的条件。

标签: c++ performance types word promotions


【解决方案1】:

没关系,这不是你能控制的。选择最窄的类型,它的宽度足以代表您需要的值。这是您在任何情况下都能做到的最好的。

语言保证操作的结果是正确的,编译器会选择它可以找到的最有效的路径。这可能涉及在某个阶段更改整数大小,也可能不会。

处理器可以进行自己的内部转换。同样,不改变结果。同样,它不在你的掌控之中。

【讨论】:

  • 我想是的。我只是做了一些测试来检查哪个更快,我没有注意到 bool、char、int、long 和 long long 之间的任何区别。
【解决方案2】:

任何人都很难给你一个直截了当的答案。在这种情况下,您能做的最好的事情就是自己分析和查看。

但除非您对这些数字进行数百万次操作,否则我怀疑哪个更快会很重要。先编写可读代码,然后再进行分析和优化。

我还听说拥有if (int) 而不是if (bool) 更快,因为bool 会被提升为int(我知道这违反直觉),但没有人改为声明int bool 只是为了性能。 (除非,也许,在分析之后)

【讨论】:

    【解决方案3】:

    按照原则,普通的int 应该是“快速、正常使用的整数”,而long 在不同时可以表示“扩展范围但可能更慢”。

    实际发生的情况很大程度上取决于您正在使用的平台。

    在我使用的几个微控制器上,int 是 16 位,long 是 32 位,long 上的操作需要多个处理器指令。在“经典”32 位 x86 上,longint 通常是相同的,所以根本没有区别。在 x86_64 上,根据可移植性问题,long 可能是 32 位或 64 位;就“执行操作的指令数”而言,它们是相同的,但如果您必须在内存中读取/存储大整数数组(32 位整数可能表现更好,因为更适合缓存),则增加的大小可能很重要(并且您可能需要考虑很多因素,优化通常是违反直觉的,尤其是在 x86 上)。

    所以,长话短说:不要过度考虑这个问题,如果您需要一个“正常”整数,它可以保证快速工作并且它的范围适合您的应用程序,只需使用int。如果您需要最小保证大小,请查看<stdint.h>typedefs(除了为您提供精确大小的整数外,还提供“具有此最小大小的最快整数”)。

    但与往常一样,通常的规则适用:如果您有性能问题,首先分析,然后优化。

    【讨论】:

      【解决方案4】:

      这是否意味着尽管需要更多内存,但 long 比 int 更有效?

      这完全取决于您的计算机。没有一种完美的整数类型是普遍最优的。如果它对性能至关重要,则需要使用一些分析工具进行检查。如果它对性能不重要,则不必在意。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-04
        • 1970-01-01
        • 1970-01-01
        • 2023-01-23
        相关资源
        最近更新 更多