先用代碼說話:spa
#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)code
計算公式: space(struct)=最後一個成員的偏移量+最後一個成員數據類型的大小+末尾填充字節數(公式1)blog
原則:編譯器
公用體(union),是個結構,他的全部的成員相對於基地址的偏移量都爲0,他的結構空間要大到足夠容納最「寬」的成員,而且對齊方式要適合於全部公用體中全部類型的成員。也就是說博客
上面的公式(公式1)也是適用的。io
計算公式: space(union)=max(成員的偏移量)+某位填充字節編譯
簡單的原則:max(成員的偏移量)要整除各個成員,若不能整除,在最後的成員的後面字節填充。程序設計
注:此處偏移量:機構中某個成員的實際地址離其結構的首地址的距離。class
引出問題:
參考:C程序設計語言(第2版),慕課網之LinuxC語言結構體(鳴謝)
本人第一次寫博客,限於能力有限,不免錯漏,請各位大神多多包涵,不吝賜筆,勘誤指正。