漫談C語言結構體struct、公用體union空間佔用

先用代碼說話: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

    原則:編譯器

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

公用體(union),是個結構,他的全部的成員相對於基地址的偏移量都爲0,他的結構空間要大到足夠容納最「寬」的成員,而且對齊方式要適合於全部公用體中全部類型的成員。也就是說博客

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

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

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

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

引出問題:

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

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

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

相關文章
相關標籤/搜索