先用代碼說話:
#include<stdio.h> union union_data0{ int a ;//本身占用4個字節 char b ;//本身占用1個字節 int c ; }; union union_data1{ short a;//本身占用2個字節 char b[13];//本身占用13個字節 int c ;//本身占用4個字節 }; struct struct_data{ int a ;//int本身占用4個字節,偏移量為0 char b ;//char本身占用1個字節,偏移量為4 int c ;//1.暫時偏移量為5,編譯器會判斷出5不是4的整數倍,會在b的后面填充3個字節,最后c的偏移量為8,使得c的偏移量為c本身大小的整數倍;2.現在整個結構體大小暫時為12,編譯器會判斷12是不是其最大成員的整數倍,會在c末尾填充為整數倍,最后得出結果為12 }; int main(int argv,char* args[]) { printf("%lu\n",sizeof(union union_data0)) ; printf("%lu\n",sizeof(union union_data1)); printf("%lu\n",sizeof(struct struct_data)) ; return 0; }
結果:
[xx@localhost cdemo]$ gcc union_struct_space.c -o union_struct_space.out [xx@localhost cdemo]$ ./union_struct_space.out 4 12 16
機構體(struct)
計算公式: space(struct)=最后一個成員的偏移量+最后一個成員數據類型的大小+末尾填充字節數(公式1)
原則:
- 每個成員的偏移量要整除本身的大小,若不能整除,在其前的成員的后面字節填充。
- 最后的結構的大小要整除最大成員的大小,若不能整除,在最后的成員的后面字節填充。
公用體(union),是個結構,他的所有的成員相對於基地址的偏移量都為0,他的結構空間要大到足夠容納最“寬”的成員,並且對齊方式要適合於所有公用體中所有類型的成員。也就是說
上面的公式(公式1)也是適用的。
計算公式: space(union)=max(成員的偏移量)+某位填充字節
簡單的原則:max(成員的偏移量)要整除各個成員,若不能整除,在最后的成員的后面字節填充。
注:此處偏移量:機構中某個成員的實際地址離其結構的首地址的距離。
引出問題:
- 為什么要字節對齊?
答:是為了能讓計算機快速讀寫,是一種以時間換取空間的方式。
參考:C程序設計語言(第2版),慕課網之LinuxC語言結構體(鳴謝)
本人第一次寫博客,限於能力有限,難免錯漏,請各位大神多多包涵,不吝賜筆,勘誤指正。
