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

标签 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。

最佳答案

4 + 8 = 12,因此 12 字节是容纳 4 字节和 8 字节对象的最小内存量。

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

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

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


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

关于c++ - 数据结构对齐:char数组和std::string数组为什么不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42623097/

相关文章:

c++ - 函数中作为引用的指针地址

gcc - 栈分配,为什么要多出空间?

c++ - 如何模拟 alignas(T)?

c++ - 使用 std::aligned_storage 过度对齐的类型

c++ - 为对象实现二维数组

c++ - isspace() 能否对 UTF-8 文本给出误报?

c++ - C++ 中的内存对齐语法

c++ - C++/Boost 中的结构成员对齐

c++ - 对 `boost::chrono::system_clock::now()' 的 undefined reference - Boost 和 cpp-netlib

c++ - 无法使用 std::variant 的重载运算符 <<() 流式传输 std::endl