Linux/IA32 下的数据对齐
data alignment under Linux/IA32
我遇到了两个结构:
struct s1{
int i;
int j;
char c;}
struct s2{
int i;
char c1;
int j;
char c2;}
课本上说S1中的c只占1个字节,而S2中的c2占4个字节,这是为什么呢?
是不是因为c1要占4个字节,而且类型一样?
在 i386 System V ABI 的结构布局规则中,s1::c
之后有 3 个字节的填充,与 s2::c1
之后相同。 (以及大多数正常的 ABI。)
总结构大小必须是其 alignof()
的倍数,数组才能工作:连续内存中的结构,每个占用 sizeof(struct s1)
,而且每个结构的开头都对齐,因此int
成员对齐。
查看两种类型的 sizeof()
和 alignof()
,以及 int 与 char。 ISO C 定义的 sizeof(char) = 1,在 i386 SysV 中,sizeof(int) = alignof(int) = 4.
如果你有一个 struct { char foo[8]; char c; };
那么它的总大小 将 只有 9 个字节,因为 alignof(char) = 1.
我遇到了两个结构:
struct s1{
int i;
int j;
char c;}
struct s2{
int i;
char c1;
int j;
char c2;}
课本上说S1中的c只占1个字节,而S2中的c2占4个字节,这是为什么呢? 是不是因为c1要占4个字节,而且类型一样?
在 i386 System V ABI 的结构布局规则中,s1::c
之后有 3 个字节的填充,与 s2::c1
之后相同。 (以及大多数正常的 ABI。)
总结构大小必须是其 alignof()
的倍数,数组才能工作:连续内存中的结构,每个占用 sizeof(struct s1)
,而且每个结构的开头都对齐,因此int
成员对齐。
查看两种类型的 sizeof()
和 alignof()
,以及 int 与 char。 ISO C 定义的 sizeof(char) = 1,在 i386 SysV 中,sizeof(int) = alignof(int) = 4.
如果你有一个 struct { char foo[8]; char c; };
那么它的总大小 将 只有 9 个字节,因为 alignof(char) = 1.