c++ - 为什么需要在结构中填充?

标签 c++ c structure

<分区>

我们知道,在结构中声明变量的正确顺序也会因为填充而改变结构的大小。我看过引用文献 here .

假设一个结构是:

struct s {
    char b; //1 for char
    char c; //1 for char + 2 for padding
    int a; //4 for int
}my_struct;

所以 my_struct 的大小是 8,但如果没有填充,它可能是 6,小于 8.

所以我的问题是:为什么填充是在结构中完成的?这个概念的必要性是什么?

因为没有填充,结构的尺寸较小。我的问题与填充何时发生无关,它更关心填充的概念。

最佳答案

许多计算机体系结构都以不同于 1 字节(通常 1 字 = 4 字节)的对齐方式优化了内存访问。对齐访问通常比未对齐访问更快(有时,不可能访问未对齐数据)。出于这个原因,编译器以最佳对齐方式打包结构成员。在您的示例中,看起来对齐大小为 2 个字节,因此 b 位于偏移量 0,c 位于偏移量 2 和 a在偏移量 4 处,总共 8 个字节(假设 a 的长度为 4 个字节)。或者,根据内联注释,在您的示例中,最佳对齐方式看起来等于数据大小。因此,bc 是相邻的,因为大小为 1,对齐也是如此,但是 a 是 4 个字节长,因此需要一个4 字节对齐。

最重要的是——这完全取决于架构。

关于c++ - 为什么需要在结构中填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30589197/

相关文章:

按下按钮更改窗口标题不起作用

c - OpenMP 和共享结构和指针

c - 读取两个整数并找出第一个整数的所有小于第二个整数的正倍数

eclipse 中的 Android 项目文件夹

c++ - OpenMP 超额订阅会导致内存错误吗?

python - 将 Python 脚本的输出链接到 C++ 程序的输入

c - 如何在Windows中的C程序中输入字符而不显示在屏幕上并且不暂停屏幕?

使用指针在结构内创建一个可变长度的 int 数组

c++ - 如何完成像 python dict.get 这样的 get_map_or_default

c++ - 为什么Boost图形库的read_graphviz()函数会更改节点的索引