在我之前提出的与按位操作有关的问题中,我被告知,如果数组没有与地址对齐,那么访问char带有int指针的数组的代码(一次操作更大的字节块)可能会有问题.charint
然后,在C中思考,我想知道malloc为未知类型分配内存时会发生什么.例如,如果我这样做void *p = malloc(sizeof(int));,我是否获得有效的char/int/long-aligned内存地址?
根据SO中引用标准的一些答案,"返回的指针应适当对齐,以便可以将其转换为任何完整对象类型的指针".
因此,我明白,我可以去char*到int*,在这种情况下没有问题:
char *p = malloc(16);
int *n = (int*)p; // use n a base of an array of 16 / sizeof(int) ints
Run Code Online (Sandbox Code Playgroud)
这是对的吗?
转向C++,似乎标准中出现了相同的规则.那么,如果我这样做,我可以假设没有对齐风险吗?
char *p = new char[16];
int *n = reinterpret_cast<int*>(p);
Run Code Online (Sandbox Code Playgroud)
是的,malloc在C和C++以及new char[N]C++中都返回一个最大对齐的指针.对齐是max_align_t来自或的类型.
gcc-4.8在这方面有一个bug,修复了gcc-4.9.只需包含并使用::maxalign_t不带std::前缀.
支持过度对齐类型,即其对齐大于上述最大值的类型,是实现定义的.例如,Posix提供posix_memalign了更大对齐的内存(例如,页面对齐).