0
struct Alignment
{
    char one;
    int four;
};
Alignment a = {' ',0};
char* buf = new char[8];
Alignment* p = new (buf) Alignment(a);

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

4

1 回答 1

1

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

在你的电脑上是 8 。不要假设物体会有多大。使用sizeof. 如果使用char* buf = new char[sizeof(Alignment)];.

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

是的。

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

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

new 表达式将请求的空间量作为 std::size_t 类型的第一个参数传递给分配函数。该参数不应小于正在创建的对象的大小;只有当对象是一个数组时,它才可能大于正在创建的对象的大小。对于 char 和 unsigned char 数组,new-expression 的结果与分配函数返回的地址之间的差应是任何大小不大于正在创建的数组的大小。[ 笔记:因为分配函数被假定返回指向存储的指针,该指针针对具有基本对齐的任何类型的对象进行了适当对齐,所以对数组分配开销的这种约束允许分配字符数组的常见习惯用法,稍后将在其中放置其他类型的对象。——尾注]

于 2013-09-20T16:59:17.640 回答