例子
定義兩個(gè)成員個(gè)數(shù)相同(3個(gè)成員)且成員類(lèi)型相同(int但狭、char、short)的但是成員順序不同的兩個(gè)結(jié)構(gòu)體:
typedef struct {
int i;
char c;
short a;
}FOO1;
typedef struct {
char c;
int i;
short a;
}FOO2;
FOO1 a1;
FOO2 b1;
使用sizeof()測(cè)試結(jié)構(gòu)體a1和b1的大忻茚!:
sizeof(a1) = 8
sizeof(b1) = 12
可以看到巢价,兩個(gè)結(jié)構(gòu)體占用的字節(jié)大小不同饲化,為什么成員相同的兩個(gè)結(jié)構(gòu)體的大小不一樣呢?這是因?yàn)?strong>字節(jié)對(duì)齊的問(wèn)題。將兩個(gè)結(jié)構(gòu)體格成員相對(duì)于結(jié)構(gòu)體的起始地址打印出來(lái):
&a1.i --> 0
&a1.c --> 4
&a1.a --> 6
&b1.c --> 0
&b1.i --> 4
&b1.a --> 8
內(nèi)存對(duì)齊主要遵循三個(gè)規(guī)則
- 結(jié)構(gòu)體變量的起始地址能夠被其最寬的成員大小整除。
- 結(jié)構(gòu)體每個(gè)成員相對(duì)于起始地址的偏移地址能都被其自身大小整除嗤朴,若果不能配椭,則在其前面一個(gè)成員后面補(bǔ)充字節(jié)。
- 結(jié)構(gòu)體字節(jié)大小能夠被最寬的成員的大小整除播赁,如果不能則在后面補(bǔ)充字節(jié)颂郎。