1. 程式人生 > >struct 和 union

struct 和 union

pri 執行 tput body size 如果 編譯 判斷 style

1. union的總大小等於它的最大字段的大小:
union u1
{
     char c;
     int i[2];
     double d;
}
u1 的大小等於double的大小,即:8。 2. union的應用場景: 當提前知道一個數據結構中兩個不同字段的使用是互斥的,那麽將兩個字段聲明為union的一部分,會減少分配空間的總量。
union node_u
{
    struct 
    {
          union node_u 
*left; union node_u *right; }internal; double data[2]; }
以上聯合體的大小為16。 3. struct的計算規則: 1、每個成員的偏移量都必須是當前成員所占內存大小的整數倍如果不是編譯器會在成員之間加上填充字節。 2、當所有成員大小計算完畢後,編譯器判斷當前結構體大小是否是結構體中最寬的成員變量大小的整數倍 如果不是會在最後一個成員後做字節填充。
struct unknown
{
  int a;
  char
b;   int c;   long d;   char e; }; printf("%lu\n", sizeof(struct unknown)); //output : 32
對以上代碼的分析: 1、遇到第一個成員變量a,該成員偏移量為0,大小為4,符合偏移規則第一條 2、接下來第二個成員變量b,偏移量為4,大小為1,符合偏移規則第一條 3、成員變量c,偏移量為5,大小為4,不符合偏移規則第一條。在成員b和c間填充三個字節,此時,偏移量大小為8,符合偏移規則第一條,繼續往下 4、成員變量d,偏移量為12,大小為8,不符合偏移規則第一條,在成員c和d之間填充4個字節,此時偏移量為16,符合偏移規則第一條,繼續往下 5、成員變量e,偏移量為24,大小為1,符合偏移規則第一條 6、所有成員大小計算完後,執行偏移規則第二條,最寬的類型是d,long類型,8個字節,當前結構體計算出的大小為25,並不符合第二條規則,於是在末尾填充7個字節,總大小為32個字節,滿足第二條偏移規則。到此結構體大小計算結束  

struct 和 union