我有一个全局的 char 数组类型。我希望起始地址与 32 位对齐。当我检查映射文件中的虚拟地址时,它是xxxxxx56H。如何将起始地址对齐为32bit的倍数。我需要通用解决方案而不是依赖于编译器的解决方案。我已经尝试过
#pragma pack(32)
char array[223];
#pragma pack
但不工作。
P.S:为了与32位对齐,地址的最后两位应该是0。
最佳答案
打包是完全不相关的事情。要对齐静态变量或结构成员(相对于结构开始),请使用标准 _Alignas
specifier .
如果您需要平台上的最大对齐方式(即适合任何类型的对齐方式),请使用max_align_t
,对于特定的字节对齐方式,只需将对齐方式指定为常量表达式即可:
_Alignas(32 / CHAR_BIT) char a[10];
(如果除法有余数,这会导致问题;您真的指的是 32 位 还是 32 字节?标准不保证一个字节有 8 位。)
如果您打算将数组转换为任何其他类型,您仍然会通过违反有效类型(也称为严格别名)规则来调用未定义的行为。为数组使用正确的类型,并使用该类型的较大对齐方式或您想要的任何内容,例如条件运算符:
Alignas(_Alignof(int) > 8 ? _Alignof(int) : 8) int a[10];
关于c - 将数组的起始地址对齐为 32 位的倍数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45170533/