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

Data structure alignment: why are array of char and std::string different

已知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。

char的对齐方式是1,字符数组也是如此。因此 class 成员之间没有添加填充。因此你得到的大小为 4 + 8 = 12.

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 是大于或等于 12 的 8(Test1 的对齐)的最小倍数。 12 是大于或等于 12 的 4(Test2 的对齐)的最小倍数。