给定数据类型的字节对齐要求是否保证为2的幂?
是否有某些东西可以提供此保证,除非“没有其他意义”,因为它不符合系统页面大小?
(背景:C / C ++,所以请随意假设数据类型是C或C ++类型,并提供C / C ++特定答案。)
答案 0 :(得分:3)
对齐要求基于硬件。大多数(如果不是全部)“现代”芯片具有可被8整除的地址,而不仅仅是2的幂。过去有8个芯片不可分割(我知道36位架构)。
答案 1 :(得分:2)
根据C标准,你可以假设关于对齐的事情:
sizeof
确定)。char
,signed char
和unsigned char
没有对齐要求。 (这实际上只是第一点的特例。)在现代现实世界中,整数和指针类型的大小为2的幂,并且它们的对齐要求通常等于它们的大小(唯一的例外是32位机器上的long long
)。浮点有点不均匀。在32位计算机上,所有浮点类型的对齐通常为4,而在64位计算机上,浮点类型的对齐要求通常等于类型的大小(4,8或16)。 / p>
struct
的对齐要求应该是其成员对齐要求的最小公倍数,但允许编译器实施更严格的对齐。但是,通常每个cpu体系结构都有一个包含对齐规则的ABI标准,并且不符合标准的编译器将生成无法与遵循ABI标准的编译器构建的代码链接的代码,因此对于a除了非常特殊的用途之外,编译器要脱离标准。
顺便说一句,一个适用于任何理智编译器的有用的宏是:
#define alignof(T) ((char *)&((struct { char x; T t; } *)0)->t - (char *)0)
答案 2 :(得分:0)
“struct”中字段的对齐,针对大小进行了优化,很可能位于奇数边界上。除此之外你的“它没有意义”可能适用,但我认为没有保证,特别是如果该程序是小型号,针对大小进行了优化。 - 乔
答案 3 :(得分:0)
对于基本数据类型(整数,浮点数,双精度),通常对齐方式与类型的大小相匹配。对于类/结构,对齐至少是其所有成员对齐的最低公倍数(这是标准的)
在Visual Studio中,您可以为类型设置自己的对齐方式,但它必须是2的幂,介于1和8192之间。
在海湾合作委员会中有一个类似的机制,但它没有这样的要求(至少在理论上)
答案 4 :(得分:0)
标准不需要对齐,但允许struct / unions / bit字段静默添加填充字节以获得正确的对齐。如果需要,编译器也可以自由地将所有数据类型对齐在偶数地址上。
话虽这么说,这取决于CPU,我不相信存在对奇数地址有对齐要求的CPU。但是,有很多CPU具有 no 对齐要求,然后编译器可以将变量放在任何地址。
答案 5 :(得分:0)
简而言之,没有。这取决于硬件。
但是,大多数现代CPU要么进行字节对齐(例如,Intel x86 CPU),要么进行字对齐(例如,Motorola,IBM / 390,RISC等)。
即使使用单词对齐,也可能很复杂。例如,一个16位字将在2字节(偶数)地址上对齐,在4字节边界上为32位字,但64位值可能只需要4字节对齐而不是8字节对齐字节对齐的地址。
对于字节对齐的CPU,它也是编译器选项的函数。通常可以指定struct成员的默认对齐方式(通常也使用特定于编译器的#pragma)。