【发布时间】:2017-07-18 15:03:17
【问题描述】:
我有一个全局的 char 数组类型。我希望起始地址与 32 位对齐。当我检查映射文件中的虚拟地址时,它是 xxxxxx56H。如何将起始地址对齐为 32 位的倍数。我需要通用解决方案而不是依赖于编译器的解决方案。我试过了
#pragma pack(32)
char array[223];
#pragma pack
但不工作。
P.S : 为了与 32 位对齐,地址的最后两位应为 0。
【问题讨论】:
-
32 位是 4 个字节?没有标准的内存分配器将提供至少 4 字节对齐的数据(通常至少 8 字节对齐),因为所提供的内存必须可用于任何目的。还是您的意思是 32 字节?对于 C,请参阅 How to allocate aligned memory only using the standard library? 但是,这主要是关于动态分配的内存;不是全局变量。
-
我需要数组的起始地址与 32 位对齐(4 的倍数,如 xxxxxx00 或 xxxxxx04 或 xxxxxx08 或 xxxxxx0c 等)。不是字节。这也意味着地址的最后两位为零。
-
@JonathanLeffler:在少于 32 位的平台上,这种情况并不少见。
-
@Olaf:我指的是标准内存分配器,意思是
malloc()等。char类型的全局变量可以在任何类型的边界上——在任何类型的机器上。char的全局数组不一定在一个偶数边界上对齐,或者更严格地说,在任何平台上,除非用_Alignas(或alignas,如果你包含<stdalign.h>)适当地限定。 -
@Jonathan Leffler 是否可以使用 #pragma 或 attribute 将 char 数组起始地址与 4 字节对齐。
标签: c arrays memory-management global