結構體大小的計算、聯合、位段

一、結構體大小的計算

硬件裏的寄存器讀取數據的整數倍,有個內存對齊的規則

struct A
{
 int a;
 int b;
};//8

struct B
{
 char a;//1+3
 int b;//4
};

struct C
{
 char a;//1+1
 short b;//2
 int c;//4
};

struct D
{
 char a;//1+3
 int b;//4
 short c;//2+6
 double d;//8
};//24

struct E
{
 char a;//1+1
 short b;//2
 int c;//4
 double d;//8
};//16


E比D排兵佈陣好(其實不一定,在一個平臺可以這麼說)
不同平臺內存對齊規則不統一
規則1:將前面的加起來看是否是後面的整數倍(這個說法不準確,應該可以說將前一個加起來看是否是後一個的倍數,湊夠最大字節的類型的倍數)


工作中:
struct  F1
{
    char a;
    char x;  //不使用,保留
    short c;
    int b;
    double d;
};


struct F
{
 int a;//4     最大單個整型
 char b;//1
};//5+3,防止定義數組


結果不是5而是sizeof(F)=8    因爲5不是4的倍數,所以加3
規則2:看所有字節加起來是不是最大單個類型的倍數

struct G
{
 char a;//1+3
 int b;//4
 short c;//2
};//10+2



struct I
{
 int a;
 struct II
 {
  float b;
  int c;
 }d;//double d
 int *p;
 short e;
};//20


int main()
{
 printf("%d\n",sizeof(struct I));

 struct F sa;
 struct F arr[2];//sizeof(arr) == 10

 return 0;
}

二、位段
       位段的聲明和任何普通的結構成員聲明相同,但有兩個例外。首先,位段成員必須聲明爲int、signed int或unsigned int類型。其次,在成員名的後面是一個冒號和一個整數,這個整數指定該位段所佔用的位的數目。
       位段可以很方便的訪問單一值。
三、聯合
       聯合的所有成員引用的是內存中的相同位置。當你想在不同的時刻把不同的東西存儲於同一個位置時,就可以使用聯合。
四、結構體遇到段位怎麼算大小?
1.struct B
{
    int a:9;
    int b:11;
    int c:12;
}
計算方法:(9+11+12)/8=4   再看4是不是sizeof(int)的倍數,若不是,則補齊
2.struct B
{
    int a:9;
    int b:11;
}
計算方法:(9+11)/8=3     3不是sizeof(int)的倍數,那麼+1 得4
五、聯合體怎麼計算大小?
union D
{
    char a;
    int b;
}
計算方法:單個成員佔用最大的那個,結果:4

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章