C 位元組對齊

2021-09-25 04:47:03 字數 2030 閱讀 7273

情況1:

typedef struct test

test;

typedef是重定義關鍵字 ,如果沒有typedef關鍵字宣告時加struct關鍵字,若有,宣告時不需要加struct關鍵字。struct後面的test是定義的型別名;若無test,說明是匿名的。大括號之後的test是定義的變名,可初始化。

上面程式中結構體的大小為3位元組,因為結構體中的型別都是同型別 char, char的大小為1位元組。所以加起來就是3個位元組。

情況2:

typedef struct test

test;

此時,結構體中的型別最大的雙精度(double)型別,位元組數為8,且處於中間,所以char型別要不起7個位元組,int型別要補齊4個位元組。則總共24個位元組。

情況3:

typedef struct test

test;

此時,結構體第乙個型別是char,第二個是short型別,佔2個位元組,所以char要補齊乙個位元組。此時前兩個位元組共4個位元組,第三個型別是double,佔8個位元組,所以前兩個要再補齊4個位元組。所以共佔16個位元組.

情況4:

/*#pragma pack(1)

typedef struct test

test;

#pragma pack(1)標明以1個位元組對齊,所以將此結構體內的型別加起來就是其的大小,為11。

情況5:

typedef struct test

;long e; //4 + 4

}test;

先看結構內部的自定義型別的大小。第乙個是int型別4個位元組,第二個是double型別佔8個位元組,第三個是char型別,所以第乙個型別要向double對齊所以補齊4個位元組,同理第三個要補齊7個位元組。所以整個自定義型別的大小為24個位元組。但是若要與結構體test中其他型別對齊,則自定義型別的大小要按照內部最大的型別來比較,所以此時short型別是2個位元組,與自定義型別中double型別8個位元組對齊,要補齊6個位元組。同理long型別要補齊4個位元組,所以結構體的大小為40(8+24+8)個位元組。

情況6:

#pragma pack(4)

typedef struct test

tt;long e;//4

}test;

#pragma pack(4)表明程式中要以4個位元組對齊,同樣,先看結構體t中,int型別4位元組,double型別8個位元組,是4的倍數;char型別是1個位元組所以要補齊3個位元組;所以結構體t是16個位元組,short型別是2個位元組,要補齊2個位元組,long型別是4個位元組;所以全部加起來是24個位元組。特別注意struct t結構體定義了tt變數說明開闢了空間,所以要佔位元組數。如果沒有定義變數tt,則說明是乙個型別,不佔大小空間,相當於不存在,可以不考慮;此時結構體test的大小為8個位元組。例如:

typedef struct test

;long e;//4

}test;

情況7:

typedef struct test

test;

此時,結構體內什麼型別都沒有,即空結構體,佔1個位元組。

情況8:

typedef struct test

test;

此時要考慮位域。: 表示位域;a : 3表示佔1個位元組的3個位元位;b : 2表示佔1個位元組的2個位元位,同理c : 1佔1個位元位。 加起來6個位元位,不足乙個位元組8個位元位。所以此時僅佔1個位元組。

但是存在限制,如果結構體中再新增乙個 char d : 3; 此時共佔9個位元位,超過了1個位元組。所以此時會佔2個位元組。但是再儲存空間位置不相同,前三個佔1個位元,後乙個佔1個位元,說明位域不跨位元組儲存。

typedef struct test

test;

此時佔8個位元組。注意:不跨位元組儲存,也不跨型別儲存。char型別中的3個位元佔1個位元組,int型別中的2個位元佔4個位元組。然後進行位元組對齊,char型別補齊3個位元組。所以共4個位元組。

例題:void main(int argc, char *ar**)

rec_s;

rec_s stmax, *pstmax;

void main()

mysql位元組對齊 C 位元組對齊彙總

一 什麼是位元組對齊 現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。二 位元組對齊的原因和...

c 位元組對齊

1.虛函式 如果 classa 有虛函式,編譯器會給每個 classa 物件新增乙個隱藏成員,該隱藏成員儲存了乙個指向虛函式表的指標.所以 sizeof classa 如果比你預想的多了 4 位,不要驚奇,因為多了乙個 size 指標 但是這個隱藏指標是先算還是後算呢?class a int a c...

c 位元組對齊

在 c 中位元組對齊主要存在符合型別中 union struct 和class中 先介紹四個概念 1 資料型別自身的對齊值 基本資料型別的自身對齊值,等於sizeof 基本資料型別 2 指定對齊值 pragma pack value 時的指定對齊值value。3 結構體或者類的自身對齊值 其成員中自...