(u)intN_t 总是对齐到 N 位?

(u)intN_t are always aligned to N bit?

  1. 例如,在 x86 体系结构上,64 位整数可以安全地对齐到 32 位而不会受到惩罚,因为仍然必须进行部分计算:整数根本不适合登记。对于 __(u)int128 一切都是一样的。但通常它们与存储的位数相同。这是否适用于所有现代和未来可能的架构?

  2. 可以将相同的int8_t或int16_t对齐到某处的32位吗?

说到未来,我指的不是革命性的建筑,它在诞生之前就已经死亡。一个字节事实上包含8位,二进制补码,平面寻址,页等。开发向量已经设置好了,不会有偏差。但是对齐的问题很有趣。

64 位整数在 x86 上是 4 字节对齐的,但是如果你采用其他 32 位架构,如 ARM、MIPS 和 PowerPC,那么你会看到 64 位整数需要在 8 字节边界对齐.

虽然这不是特定于处理器的,因为 64 位加载和存储是在使用两个 4 字节访问的软件中模拟的。相反,这是 C 编译器使用的 ABI 的一部分。我只能猜测他们为什么选择这样做,很可能是由于性能:无论 CPU 寄存器的大小如何,CPU 总线今天可能比 32 位宽,所以 loading/storing 如果 8 字节整数是 8 字节对齐的,则它们会更快。另一个原因是对于原子操作,8 字节整数仍然必须在 8 字节边界对齐。

所以是的,(u)intN_t 始终与 x86_64、ARM、AArch64、PowerPC、PowerPC64、MIPS、MIPS64 上的 N 位对齐。这是否是 "modern enough" 由您决定。但在未来,由于性能原因,8 字节整数可能会使用 8 字节对齐,而不管处理器 GPR 的宽度。

非标准 128 位和更大整数的情况可能有所不同。由于数据通常是从高速缓存行(通常为 64 字节)中的高速缓存中获取的,因此将它们也设为 128 位对齐会更有效,但无论出于何种原因,实现可能不会选择这样做。但是 128 位整数是非标准的,您可能仍然需要为它们提供依赖于平台的解决方案,因此您也可以 "fix" 它们的对齐方式。目前 GCC 在 AArch64、x86_64、PowerPC64 上保持 __int128 16 字节对齐。

至于未来的架构,我会说他们必须提供类似的环境,否则他们无论如何都会有很多软件的问题。大多数软件的可移植性都很高 exaggerated.Is 这种不常见的架构现在可能会流行起来吗?不太可能。你需要支持吗?可能不是,它可能太特别了,你的软件无论如何都无法在上面运行。