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)
?
| 归档时间: |
|
| 查看次数: |
510 次 |
| 最近记录: |