我有一个数组类型的char,它是全局的。我想要开始地址与32位对齐。当我检查地图文件中的虚拟地址时,它是xxxxxx56H。如何将起始地址对齐为32位的倍数。我需要通用解决方案,而不是编译器依赖的解决方案。我试过了
#pragma pack(32)
char array[223];
#pragma pack但不起作用。
为了和32位对齐,最后两位地址应该是0。
发布于 2017-07-18 15:18:07
包装是完全不相关的东西。若要对齐静态变量或结构成员(相对于结构启动),请使用标准 specifier。
如果您需要平台上的最大对齐(即适合于任何类型的对齐),请使用max_align_t,对于特定的字节对齐,只需将对齐指定为常量表达式:
_Alignas(32 / CHAR_BIT) char a[10];(如果除法有余数,就会产生问题;您指的是32 位还是32 字节?标准不保证一个字节有8位。)
如果打算将数组强制转换为任何其他类型,则仍然通过违反有效类型(也称为严格混叠)规则来调用未定义的行为。对数组使用正确的类型,并使用更大的类型对齐或任意类型,例如使用条件运算符:
Alignas(_Alignof(int) > 8 ? _Alignof(int) : 8) int a[10];发布于 2017-07-18 16:29:23
定义在32位边界上对齐的char数组的一种可移植方式是:
union {
char array[223];
unsigned long ul;
} u;u将在32位边界上对齐,如果unsigned long类型需要,则可能会有2的更大功率,这在您的系统中是非常可能的。该数组以u.array的形式访问。没有语用,没有C11特定的语法,没有编译器特定的扩展。
如果uint32_t类型可用,您可以使用它来代替unsigned long。
这个解决方案实际上并不是可移植的,但是对于那些不支持_Alignas说明符的过时编译器来说,这是一个很好的解决方案。您的编译器似乎与当前(或以前的)C标准不同步。
唯一正确的解决方案是使用_Alignas说明符。如果您给出了更多的上下文,例如您使用的是什么系统和编译器,以及为什么需要32位对齐,那么可以为您的问题找到更好的解决方案。
https://stackoverflow.com/questions/45170533
复制相似问题