已知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。
4 + 8 = 12,因此 12 字节是容纳 4 字节和 8 字节对象的最小内存量。
但是,除了子对象的总字节数之外,还有一个考虑因素。每个子对象都有特定的对齐要求。
std::string
的对齐取决于其完整的子对象,这些子对象是实现定义的。看来,您的实现中的 std::string
必须与 8 字节边界对齐。这样一来,Test1
的对齐要求也是8,在成员i
之后必须有4个字节的padding。因此,Test1
的大小是子对象大小 + 填充字节的总和,总计 4 + 8 + 4 = 16。
char
和 char[8]
的对齐要求为 1。因此 Test2
的对齐要求为 4
(因为 int
成员)并且在成员 i
之后不需要填充。由于没有填充,Test2
的大小与子对象大小的总和相匹配。
另一种观点是尺寸必须是对齐要求的倍数。 16 是大于或等于 12 的 8 的最小倍数(Test1
的对齐)。12 是大于或等于 12 的 4 的最小倍数(Test2
的对齐)大于或等于 12。