如何检查malloc()实现中返回数据的对齐方式?

Ana*_*oly 5 c c++ memory-management

malloc(sz) 返回其对齐适用于任何对象的内存.

在32位x86机器上,这意味着返回的地址值malloc()必须可以被4整除.但实际上,32位malloc实现返回8字节对齐的内存,这意味着返回的地址始终可以被8整除.也应该这样做.(在x86-64/IA-64机器上,最大数据对齐为8,但malloc实现返回16字节对齐的内存.)

我对这种情况进行了测试

// Check alignment of returned data.

 int main() 
 {
     double* ptr = (double*) malloc(sizeof(double));
     assert((uintptr_t) ptr % __alignof__(double) == 0);
     assert((uintptr_t) ptr % __alignof__(unsigned long long) == 0);

     char* ptr2 = (char*) malloc(1);
     assert((uintptr_t) ptr2 % __alignof__(double) == 0);
     assert((uintptr_t) ptr2 % __alignof__(unsigned long long) == 0);
  }
Run Code Online (Sandbox Code Playgroud)

我的malloc代码分配的空间比用户请求的多.该空间的第一部分用于存储有关分配的元数据,包括分配的大小.

sizeof(metadata) % 8 == 0

但我的堆

 static char heap[Heap_Capacity];
Run Code Online (Sandbox Code Playgroud)

以不除以8的值开始

metadata* block = (metadata*)heap;
(uintptr_t)block % 8 != 0
Run Code Online (Sandbox Code Playgroud)

我的测试失败了,在这种情况下我该怎么办?如何确保数组以地址开头

metadata* block = (metadata*)heap;
(uintptr_t)block % 8 == 0
Run Code Online (Sandbox Code Playgroud)

yac*_*oor 2

您可以使用联合来强制正确对齐(请参阅联合元素对齐)或计算正确对齐的分配的起始索引(这可能会减少堆容量最多 7 个字节)。