数据结构对齐:为什么char和std :: string的数组不同

时间:2017-03-06 10:24:11

标签: c++ memory-alignment

已知sizeof(std::string)为8,sizeof(int)为4.

class Test1
{
int i;            // 4
std::string str;  // 8
};

sizeof(Test1)为16,因为8 = N1 * 4且16 = N2 * 8.(N1和N2是自然数)

但是,如果我将std::string替换为char [8],如下所示:

class Test2
{
int i;       // 4
char ch[8];  // 8
};

我不知道为什么sizeof(Test2)给了我12个。

2 个答案:

答案 0 :(得分:0)

char的对齐方式为1,这也适用于字符数组。因此,类成员之间不会添加填充。因此,您将获得4 + 8 = 12的大小。

答案 1 :(得分:0)

4 + 8 = 12,所以12个字节是适合4字节和8字节对象的最小内存量。

但是,除了子对象的总字节数之外,还有另一个考虑因素。每个子对象都有特定的对齐要求。

std::string的对齐取决于其完整的子对象,它们是实现定义的。看来,您的实现上的std::string必须与8字节边界对齐。因此,Test1的对齐要求也是8,并且在成员i之后必须有4个字节的填充。因此,Test1的大小是子对象的大小+填充字节的总和,总计4 + 8 + 4 = 16.

char因此char[8]的对齐要求为1.因此,Test2的对齐要求为4(因为int成员)并且没有填充会员i后需要。由于没有填充,Test2的大小与子对象的大小之和相匹配。

另一种观点是,大小必须是对齐要求的倍数。 16是8的最小倍数(Test1的对齐),其大于或等于12. 12是4的最小倍数(Test2的对齐),其大于或等于12。