C++ malloc和new是否返回整数对齐的地址?
在一次与逐位操作相关的提问中,我被告知,如果C++ malloc和new是否返回整数对齐的地址?,c++,c,pointers,C++,C,Pointers,在一次与逐位操作相关的提问中,我被告知,如果char数组未与int地址对齐,则使用int指针访问char数组(一次操作较大的字节块)的代码可能会出现问题 然后,用C思考,我想知道当malloc为未知类型分配内存时会发生什么。例如,如果我执行void*p=malloc(sizeof(int)),是否获取有效的char/int/long-aligned内存地址 根据此处引用的标准“返回的指针应适当对齐,以便可以转换为任何完整对象类型的指针” 因此,我理解,在这种情况下,我可以从char*到int*,
char
数组未与int
地址对齐,则使用int
指针访问char
数组(一次操作较大的字节块)的代码可能会出现问题
然后,用C思考,我想知道当malloc
为未知类型分配内存时会发生什么。例如,如果我执行void*p=malloc(sizeof(int))代码>,是否获取有效的char/int/long-aligned内存地址
根据此处引用的标准“返回的指针应适当对齐,以便可以转换为任何完整对象类型的指针”
因此,我理解,在这种情况下,我可以从char*
到int*
,没有任何问题:
char*p=malloc(16);
int*n=(int*)p;//使用n作为16/sizeof(int)int数组的基
对吗
移动到C++,似乎是这样。那么,如果我这样做,是否可以假设没有对齐风险
char*p=新字符[16];
int*n=重新解释铸造(p);
> p>是的,在C++和C++中,代码< MalOC/<代码> > <代码>新char [n] < /COD> C++中返回一个最大对齐的指针。对齐方式是从或中选择的类型max\u align\t
gcc-4.8在这方面有一个缺陷,已在gcc-4.9中修复。只需包含并使用::maxallign_t
,而不使用std::
前缀
对过度对齐类型(即对齐度大于上述最大值的类型)的支持由实现定义。例如,Posix提供了Posix_memalign
来分配具有更大对齐(例如页面对齐)的内存。malloc
返回一个地址,该地址对于C中的任何基类型都是正确对齐的。这意味着它可以安全地转换为所有这些类型的指针(int
、long、double
等等)
减少一个static_cast
你能告诉我使用两个static cast的好处吗?@ChronoTriggerreinterpret_cast
几乎可以处理任何事情。但是static\u cast
不会,它使用起来更安全、更便携。在这种情况下不需要使用它。请注意,C++11显式地使reinterpret\u cast(p)
等效于[expr.reinterpret.cast]/7中的static\u cast(static\u cast(p))
。@avakar但是reinterpret\u cast
的参数可以是任何东西,甚至函数指针也可以被转换为int*
,这在静态\u cast
@user1095108中是不可能的:
和
如何与std
和全局名称空间交互是一整罐蠕虫-我认为最终的效果是没有人确切知道,而且你总是必须同时拥有这两种名称空间-S@KerrekSB-为了避免人们产生错误的印象,
总是将名称放入std
中,`总是将名称放入全局命名空间中。的确,没有人确切知道另一个名称空间中有什么内容。@JensGustedt我删除了注释,一定是误读了代码。我肯定我认为C代码中有一个角色。奇怪。是的,有一个演员阵容,但我在看到你的评论后删除了它,@unwind。很抱歉没有说。可能值得注意的是,指针只需要具有使其可用所需的任何对齐方式;如果架构从奇数字节地址读取long-long
没有问题,那么实现可以合法地从malloc
返回奇数字节地址。
char* p = new char[16];
int* n = reinterpret_cast<int*>(p);
char* p = new char[16];
int* n = static_cast<int*>(static_cast<void*>(p));
void* p = operator new(16);
int* n = static_cast<int*>(p);