数据结构对齐:为什么 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
的对齐)的最小倍数。
已知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
的对齐)的最小倍数。