【发布时间】:2015-07-23 12:24:52
【问题描述】:
struct test {
char c;
} x;
根据我对结构填充的了解,我预计此结构的大小在 32 位系统上为 4 字节。为什么显示1个字节?
【问题讨论】:
-
因为它可以在任何地址有效地访问。见stackoverflow.com/questions/29813803/structure-padding
struct test {
char c;
} x;
根据我对结构填充的了解,我预计此结构的大小在 32 位系统上为 4 字节。为什么显示1个字节?
【问题讨论】:
你只有一个字符,在这种情况下你不需要任何对齐/填充。 如果你尝试这个,你应该会看到一些对齐:
char *p; /* 4 or 8 bytes */
char c; /* 1 byte */
//char pad[3]; /* 3 bytes */
int x; /* 4 bytes */
对于不同的架构有不同的规则,在这种情况下,int 有一个 4 字节对齐,这会强制添加三个字节的填充。
【讨论】:
在 C 中,结构被填充到当前数据大小。 如果你有一个 char 将对齐到 1B,短到 2B 等等。
一个快速的规则是:先前元素的大小 + 当前元素的大小与当前元素的大小对齐。
这里有一些例子:
struct
{
int a1; // 0 + 4 aligned to 4 => 4
char a2; // 4 + 1 aligned to 1 => 5
} // total size 5
struct
{
char a1; // 0 + 1 aligned to 1 => 1
int a2; // 1 + 4 aligned to 4 => 8
}
struct
{
char a1; // 0 + 1 aligned to 1 => 1
short a2; // 1 + 2 aligned to 2 => 4
int a3; // 4 + 4 aligned to 4 => 8
}
这条规则是内存寻址的影响: 读取/写入 X 字节内存的最快方法是该内存地址是 X 的倍数。(这就是英特尔处理器通过忽略某些寻址位来优化内存访问的方式)。
另一个填充是内存中的结构之间。如果您的结构具有 int 和 char(总大小为 5),则在内存中,它们之间仍将有 3 个字节填充以优化内存访问。
【讨论】: