字节对齐的结构填充 - 具体示例
Structure padding for byte alignment - specific example
我正在阅读麻省理工学院开放式课件的讲义,内容是关于结构填充的 C 实用程序设计:
在里面,明白了为什么下面这个结构体的大小是16:
struct foo {
short s;
union {
int i;
char c;
}u;
unsigned int flag_s : 1;
unsigned int flag_u : 2;
unsigned int bar;
}
为了尽量减少结构的大小,作者将字段的大小从大到小重新排列:
struct foo {
union {
int i;
char c;
}u;
unsigned int bar;
short s;
unsigned int flag_s : 1;
unsigned int flag_u : 2;
}
作者说结构的大小现在应该是 12。但是,在我的 Windows 32 位机器上,我得到的结构大小输出仍然是 16。这是为什么?
仅当我将 'short s' 字段移动到位字段下方时,我得到的结构大小为 12。这是因为位字段必须从 4 字节边界开始,因为它是无符号整数?所以在上面的结构中,在'short s'字段之后还会有2个字节的padding?
根据 C 语言标准,位域布局取决于实现。所以这个结构的大小在作者的机器上是 12 字节,但在你的机器上是 16 字节(但是,奇怪的是,在讲座中他们声称它的大小是 12 字节,却没有指出它是编译器依赖的) .
我正在阅读麻省理工学院开放式课件的讲义,内容是关于结构填充的 C 实用程序设计:
在里面,明白了为什么下面这个结构体的大小是16:
struct foo {
short s;
union {
int i;
char c;
}u;
unsigned int flag_s : 1;
unsigned int flag_u : 2;
unsigned int bar;
}
为了尽量减少结构的大小,作者将字段的大小从大到小重新排列:
struct foo {
union {
int i;
char c;
}u;
unsigned int bar;
short s;
unsigned int flag_s : 1;
unsigned int flag_u : 2;
}
作者说结构的大小现在应该是 12。但是,在我的 Windows 32 位机器上,我得到的结构大小输出仍然是 16。这是为什么?
仅当我将 'short s' 字段移动到位字段下方时,我得到的结构大小为 12。这是因为位字段必须从 4 字节边界开始,因为它是无符号整数?所以在上面的结构中,在'short s'字段之后还会有2个字节的padding?
根据 C 语言标准,位域布局取决于实现。所以这个结构的大小在作者的机器上是 12 字节,但在你的机器上是 16 字节(但是,奇怪的是,在讲座中他们声称它的大小是 12 字节,却没有指出它是编译器依赖的) .