数据是否在放置新分配的内存中对齐

Will data align in the memory allocated by placement new?

本文关键字:分配 内存 对齐 是否 新分配 数据      更新时间:2023-10-16
struct Alignment
{
    char one;
    int four;
};
Alignment a = {' ',0};
char* buf = new char[8];
Alignment* p = new (buf) Alignment(a);

由于内存对齐,对齐 a 的大小为 8。但是 p 指向对齐实例的大小是多少?按放置新分配的缓冲区中是否有内存对齐?

由于内存对齐,对齐 a 的大小为 8。

在您的计算机上是 8。不要假设物体会有多大。使用 sizeof .如果使用char* buf = new char[sizeof(Alignment)];会好得多.

按放置新分配的缓冲区中是否有内存对齐?

是的。

好吧,有两个假设,答案是肯定的。首先,这假设您没有重载operator new(或者您的重载满足 5.3.4)。其次,它假定您已经分配了一个大小合适的数组。

该标准明确允许完全按照您所做的操作进行操作。见5.3.4第10段:

new-表达式将请求的空间量作为类型为 std::size_t 的第一个参数传递给分配函数。该参数应不小于所创建对象的大小;仅当对象是数组时,它才可能大于所创建对象的大小。对于 char 和无符号 char 数组,new-expression 的结果与分配函数返回的地址之间的差值应为大小不大于正在创建的数组大小的任何对象类型最严格的基本对齐要求 (3.11) 的整数倍。[ 注意:由于假定分配函数返回指向存储的指针,该指针对于具有基本对齐的任何类型的对象都进行了适当对齐,因此对数组分配开销的这种约束允许分配字符数组的常见习惯,稍后将在其中放置其他类型的对象。