為了提高CPU的存儲(chǔ)速度,編譯器對(duì)一些變量的起始地址做了”對(duì)齊”處理。在默認(rèn)情況下,編譯器規(guī)定各成員變量存放的起始地址相對(duì)于結(jié)構(gòu)的起始地址的偏移量必須為該變量的類型所占用的字節(jié)數(shù)的倍數(shù)。
字節(jié)對(duì)齊的細(xì)節(jié)和編譯器實(shí)現(xiàn)相關(guān),但一般而言,滿足三個(gè)準(zhǔn)則:
- 結(jié)構(gòu)體變量的首地址能夠被其最寬基本類型成員的大小所整除;
- 結(jié)構(gòu)體每個(gè)成員相對(duì)于結(jié)構(gòu)體首地址的偏移量(offset)都是成員大小的整數(shù)倍,如有需要編譯器會(huì)在成員之間加上填充字節(jié)(internal adding);
- 結(jié)構(gòu)體的總大小為結(jié)構(gòu)體最寬基本類型成員大小的整數(shù)倍,如有需要編譯器會(huì)在最末一個(gè)成員之后加上填充字節(jié)(trailing padding)。
struct MyStruct{
double dda1;
char dda;
int type
};
sizeof(MyStruct) 為 8+1+3+4=16
struct MyStruct{
char dda;
double dda1;
int type;
};
sizeof(MyStruct) 為 1+7+8+4+4=24