给定数据类型的字节对齐要求是否保证为2的幂?

时间:2011-03-02 20:43:24

标签: c++ c alignment memory-alignment

给定数据类型的字节对齐要求是否保证为2的幂?

是否有某些东西可以提供此保证,除非“没有其他意义”,因为它不符合系统页面大小?

(背景:C / C ++,所以请随意假设数据类型是C或C ++类型,并提供C / C ++特定答案。)

6 个答案:

答案 0 :(得分:3)

对齐要求基于硬件。大多数(如果不是全部)“现代”芯片具有可被8整除的地址,而不仅仅是2的幂。过去有8个芯片不可分割(我知道36位架构)。

答案 1 :(得分:2)

根据C标准,你可以假设关于对齐的事情:

  • 任何类型的对齐要求除以该类型的大小(由sizeof确定)。
  • 字符类型charsigned charunsigned 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)。