问题描述
我遇到两个结构:
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
之后有3个填充字节。 (以及大多数普通的ABI。)
要使数组起作用,总的结构大小必须是其alignof()
的倍数:连续内存中的结构,每个结构都占用sizeof(struct s1)
,而且每个结构的开始都必须对齐,以便int
个成员已对齐。
查看两种类型的sizeof()
和alignof()
以及int vs. char。按照ISO C的定义,sizeof(char)= 1,在i386 SysV中,sizeof(int)= alignof(int)= 4。
如果您有一个struct { char foo[8]; char c; };
,那么它的总大小将仅为9个字节,因为alignof(char)= 1。