(u)intN_t总是与N位对齐? [关闭]

问题描述 投票:2回答:1
  1. 例如,在体系结构x86上,64位整数可以安全地对齐到32位而没有损失,因为仍然需要进行部分计算:整数根本不适合寄存器。对于__(u)int128,一切都是一样的。但通常它们与存储时的位数相同。这适用于所有现代和未来可能的架构吗?
  2. 同一个int8_t或int16_t可以在某处对齐32位吗?

谈到未来,我的意思不是革命性的建筑,即使在出生之前也会死亡。字节事实上包含8位,二进制补码,平面寻址,页面等。开发向量已经设置,不会有偏差。但是对齐问题很有意思。

c struct memory-alignment
1个回答
1
投票

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

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

所以是的,(u)intN_t始终与x86_64,ARM,AArch64,PowerPC,PowerPC64,MIPS,MIPS64上的N位对齐。由你来决定这是否“足够现代”。但是将来很可能由于性能的原因,8字节整数将使用8字节对齐,而不管处理器GPR的宽度如何。

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

至于未来的架构,我会说他们必须提供类似的环境,否则他们会遇到很多软件的问题。大多数软件的可移植性都被夸大了。这种不常见的架构有可能在今天变得流行吗?不太可能。你需要支持吗?可能不是,它可能是如此特殊,无论如何你的软件都无法工作。

© www.soinside.com 2019 - 2024. All rights reserved.