已知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个。
答案 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。