数据是否会在由新位置分配的内存中对齐?

时间:2013-09-20 16:01:19

标签: c++ alignment

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

由于存储器对齐,对齐a的大小为8。但是p指向的Alignment实例的大小是多少?在放置new?

分配的缓冲区中是否会有内存对齐

1 个答案:

答案 0 :(得分:1)

  

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

计算机上有8 。不要假设对象有多大。使用sizeof。如果使用char* buf = new char[sizeof(Alignment)];会好得多。

  

在贴片新分配的缓冲区中会有内存对齐吗?

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

标准明确允许完成您所做的事情。见5.3.4,第10段:

  

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