
资料来源:http ://geeksforgeeks.org/?p=9705
总之:它在不影响对齐的情况下尽可能地优化位的打包(这就是位字段的含义)。
变量的数据对齐处理数据存储在这些银行中的方式。例如 int 在 32 位机器上的自然对齐是 4 个字节。当数据类型自然对齐时,CPU 会在最短的读取周期内获取它。
类似地,自然对齐short int
是 2 个字节。这意味着,一个短整数可以存储在 bank 0 – bank 1 pair 或 bank 2 – bank 3 pair 中。Adouble
需要 8 个字节,并且在存储体中占据两行。double 的任何未对齐都会强制两个以上的读取周期来获取 double 数据。
请注意,双变量将在 32 位机器上的 8 字节边界上分配,并且需要两个内存读取周期。在 64 位机器上,根据存储体的数量,双变量将分配在 8 字节边界上,并且只需要一个内存读取周期。
所以编译器会为每个结构引入对齐要求。它将是该结构中最大的成员。如果你char
从你的 中删除struct
,你仍然会得到4 个字节。
在您的struct
,char
中是 1 个字节对齐的。它后面是一个int
位域,它是 4 字节对齐的整数,但您定义了一个位域。
8 位 = 1 个字节。Char
可以是任何字节边界。所以Char
+ Int:8
= 2 个字节。嗯,这是一个奇数字节边界,因此编译器添加了额外的 2 个字节来维持 4 字节边界。
对于 8 个字节,您必须声明一个实际的int
(4 个字节)和一个char
(1 个字节)。那是5个字节。嗯,这是另一个奇数字节边界,所以struct
填充到8 bytes。
我过去通常做的控制填充是在我之间放置填充符struct
以始终保持 4 字节边界。所以如果我有struct
这样的:
struct s {
int id;
char b;
};
我将插入分配如下:
struct d {
int id;
char b;
char temp[3];
}
这将给我一个struct
大小为 4 字节 + 1 字节 + 3 字节 = 8 字节!通过这种方式,我可以确保以struct
我想要的方式填充我的内容,特别是如果我通过网络将它传输到某个地方。此外,如果我改变了我的实现(例如,如果我可能将它保存struct
到一个二进制文件中,填充物从一开始就在那里,所以只要我保持我的初始结构,一切都很好!)
最后,您可以阅读这篇关于C Structure size with bit-fields的文章以获得更多解释。