漫談C語言結構體struct、公用體union空間占用,先用代碼說話:
#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版)中文版及英文版 高清晰PDF下載地址:http://www.linuxidc.com/Linux/2012-05/60076.htm