1. 程式人生 > >獲取結構體位元組數簡單的方法

獲取結構體位元組數簡單的方法

結構體計算要遵循位元組對齊原則

結構體預設的位元組對齊一般滿足三個準則:

1) 結構體變數的首地址能夠被其最寬基本型別成員的大小所整除;

2) 結構體每個成員相對於結構體首地址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding);

3) 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末一個成員之後加上填充位元組(trailing padding)

其實 暫且不管這三原則,我的方法只要記住第三個,就是結構體大小結果要為成員中最大位元組的整數倍

先看下面定義的兩個結構體.

struct {   char a;   short b;   char c; }S1;

struct {  char  a;  char  b;  short c; }S2;

分別用程式測試得出sizeof(S1)=6 , sizeof(S2)=4

注意 為什麼 僅僅改變了結構體成員的順序,結果不一樣?

解:

(1)首先找出成員變數中最大的位元組,可見對於S1和S2 最大是short ,佔2個位元組,

  (2)所以以後都已2個位元組為準,也就是說最多隻要2個位元組,其他填充佔位,注意下圖一個格子表示一個位元組,

    (3)所以先畫2個格子,以後看成員順序,逐次增加,每次一2為增加基準

    對於S1 ,來說,順序是 char->short->char      

2個位元組
第一個char佔一個位元組     多的這一個補0,只是佔位作用
short 剛好佔2個位元組
第二個char也佔1個 多的這一個補0

所以對於S1結構體大小為 2*3=6,至於為什麼第二個char,多的那個位元組不丟到,就是遵循第三個原則,就是結構體大小結果要為成員中最大位元組的整數倍

對於S2 嘛,也畫個圖,但是順序是 char->char->short

第一個char佔一個位元組 第二個char佔一個位元組
short 剛好佔2個位元組

S2=2*2=4

按照這個方法再看這樣的一個結構體:

struct stu1
         {
               int i;
                             char c;
               int j;
         };

很明顯:最大位元組為4個。順序int  char int

stu1
int int int int
char 0 0 0
第二個int int int int

因為 int佔4個,而char已經咱了一個,不夠,所以那三個只能多餘佔位

Stu1=3*4=12

那麼換一下呢?

struct stu2
         {
               int i;
                            
               int j;

            char  c;
         };

Stu2=3*4=12;

再看一個:就是當結構體成員變數是另外一個結構體時,只要把結構體中成員為另一結構體作為整體相加就行

typedef struct A
{
char a1;
short int a2;
  int a3;
  double d;

};

A=16

typedef struct B
{
long int b2;
short int b1;
A a;

};

而對於B,先不要管A a,也就是先去掉A a 成員結構體B 算得 其為8,所以最後結果為8+16=24;