漫談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)

    原則:

  1. 每個成員的偏移量要整除本身的大小,若不能整除,在其前的成員的后面字節填充。
  2. 最后的結構的大小要整除最大成員的大小,若不能整除,在最后的成員的后面字節填充。 

公用體(union),是個結構,他的所有的成員相對於基地址的偏移量都為0,他的結構空間要大到足夠容納最“寬”的成員,並且對齊方式要適合於所有公用體中所有類型的成員。也就是說

上面的公式(公式1)也是適用的。

  計算公式:  space(union)=max(成員的偏移量)+某位填充字節

  簡單的原則:max(成員的偏移量)要整除各個成員,若不能整除,在最后的成員的后面字節填充。

注:此處偏移量:機構中某個成員的實際地址離其結構的首地址的距離。

引出問題:

  1. 為什么要字節對齊?
    答:是為了能讓計算機快速讀寫,是一種以時間換取空間的方式。

參考:C程序設計語言(第2版),慕課網之LinuxC語言結構體(鳴謝)

本人第一次寫博客,限於能力有限,難免錯漏,請各位大神多多包涵,不吝賜筆,勘誤指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM