歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 漫談C語言結構體struct、公用體union空間占用

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

日期:2017/3/1 9:16:19   编辑:Linux編程

漫談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版)中文版及英文版 高清晰PDF下載地址:http://www.linuxidc.com/Linux/2012-05/60076.htm

Copyright © Linux教程網 All Rights Reserved