Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ malloc和new是否返回整数对齐的地址?_C++_C_Pointers - Fatal编程技术网

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的好处吗?@ChronoTrigger
reinterpret_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);