【问题标题】:Preferring shortest possible types偏好尽可能短的类型
【发布时间】:2016-11-12 14:38:51
【问题描述】:

压倒性的建议似乎是更喜欢 C 中的 ints,除非空间很重要 (http://c-faq.com/decl/inttypes.html)。

倾向于使用尽可能短的类型不是更有意义吗?

较短的类型在大型集合中具有明显的优势——使用较短的类型,集合将占用更少的空间。

在数值函数中,ints 有一个优势,因为 CPU 处理它们应该更快,但是当我声明一个 @ 时,优化器的工作不就是交换一个 int 987654325@ 在堆栈上,然后我继续计算?

我尝试编译几个数值函数,一次使用短裤,然后使用整数,我在 -O3 处得到了相同的输出程序集(短裤是 2 个字节,整数在我的架构上是 4 个)所以看起来int 建议不再有效,特别是考虑到空间节省的潜力,考虑到 CPU/内存性能差距的扩大,这比以往任何时候都更重要。 (我认为数据结构同时用于数字和大型集合是很常见的)。

有什么理由我不应该倾向于默认为尽可能短的类型?

【问题讨论】:

  • 程序集不可能完全相同:如果不出意外,则需要将数据转换为另一种类型。
  • @ScottHunter 我尝试了类似$t compute_${t}($t a, $t b) { $t sum = 0; for($t i; i<30; i++){ sum += a+2*b; } return sum; } 的方法,但在这两种情况下都减少到了lea 0x1(%rsi),%eax imul %eax,%edi imul $0x1e,%edi,%eax retq 。我想如果一切都发生在寄存器中,那么就不需要转换了。

标签: c optimization


【解决方案1】:

您应该坚持使用标准 int,因为它是机器最容易使用的尺寸。其他尺寸需要额外说明或特殊说明,而这些说明占用更多空间。

您说您使用 -O3 获得了相同的输出程序集,但我会非常仔细地检查这一点,例如我会在汇编语言输出文件之间运行 diff。

如果您有一个大量的整数值,使得数据空间差异超过程序大小差异,则考虑较短的值。 即使那样,如果存储大小实际上是一个问题,也只需要担心这一点。 通常不是。

【讨论】:

  • 我尝试的第一个测试被编译为纯粹在寄存器中发生,所以确实没有区别。当我尝试将该函数应用于数组时,short 版本与预期的略有不同。我仍然想知道由于添加指令而增加的 CPU 时间将如何被不同工作集大小的内存访问减少所抵消。新硬件时间相对内存访问的增加很可能会使旧建议过时,但我认为要知道,需要一些广泛的基准测试。
  • @PSkocik:我不知道你是否假设,正如许多其他程序员所假设的那样,你专注的这段代码实际上会占总执行时间的很大一部分,包含它的应用程序。我确定您知道streetlight effect。通常,当我进行性能调整时,可能会有几个我无法提前猜到的大加速,然后是一些像你这样的紧凑代码,最初需要大约 1% 的时间,只有在其他代码之后才值得关注。跨度>
【解决方案2】:

我同意 Mike 的 cmets 关于坚持原始尺寸的观点。我从硬件的角度理解您的问题(应该是总线上启用了哪些字节的问题)。

如果您有 32 位总线,但决定使用 16 位或 8 位整数,您可能会在处理器上增加打包/解包成本。我使用过的一些较旧的 RISC 处理器一次只想获取 32 位。所以如果你想更新一个字节,它必须先读取整个 32 位,然后它需要屏蔽掉感兴趣的字节。

请务必使用您的目标编译器和优化设置进行测试。如果您确实看到 32 位与 16 位或 8 位整数之间的差异,请查看您的编译器是否可以为您提供一个 interlist,这将使您了解编译器如何处理短整数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 2011-01-28
    • 2011-07-03
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多