C語言結構體位元組對齊總結

2021-07-23 23:17:00 字數 1890 閱讀 1442

首先說說為什麼要對齊。為了提高效率,計算機從記憶體中取資料是按照乙個固定長度的。以32位機為例,它每次取32個位,也就是4個位元組。位元組對齊有什麼好處?以int型資料為例,如果它在記憶體中存放的位置按4位元組對齊,也就是說1個int的資料全部落在計算機一次取數的區間內,那麼只需要取一次就可以了。如果不對齊,很不巧,這個int資料剛好跨越了取數的邊界,這樣就需要取兩次才能把這個int的資料全部取到,這樣效率也就降低了。

其實不同的編譯器,會對位元組對齊進行不同的優化。這裡以編譯器不對位元組對齊做任何優化為前提來討論。

以下例子均在ubuntu10.04下按gcc -o0命令編譯。

一、原則:

1:當未明確指定時,以結構體中最長的成員的長度為其有效值。 如:

struct aaaa;

char的字對齊長度為1,所以可以在任何位址開始,但是,int自對齊長度為4,必須以4的倍數字址開始。所以,儘管1-3空著,但b也只能從4開始。再加上c後,整個結構體的總長度為9,結構體的有效對齊值為其中最大的成員即int的長度4,所以,結構體的大小向上擴充套件到12,即9-11的位址空著。

當結構體中包含其他的符合型別時:

陣列 :按照基本資料型別對齊,第乙個對齊了後面的自然也就對齊了。 

聯合 :按其包含的長度最大的資料型別對齊。 

結構體: 結構體中每個資料型別都要對齊。

2:當用#pragma pack(n)指定時,以n和結構體中最長的成員的長度中較小者為其值。

這個巨集定義既限制了整個結構體的對齊方式,也限制了結構體內部的變數的對齊方式。

#pragma pack(2)

struct aaaa;

printf("sizeof aa = %d\n",sizeof(aa)); 結果是8。

假如位址從0開始算起,則變數a佔據了頭兩個位元組,變數b佔據了接著的4個位元組,變數c佔據了最後的兩個位元組。

在這裡,變數b按2位元組對齊方式,整個結構體也按2位元組對齊。

當被#pragma pack限制的結構體1裡面包含未被限制的結構體2,則未被限制的結構體2內部按它自己的

規則來決定對齊方式,結構體1把結構體2當作乙個一般的變數來處理。例如:

struct n ;

#pragma pack(2)

struct s ;

struct n cc;

struct s bb;

printf("sizeof cc = %d\n",sizeof(cc));

printf("sizeof bb = %d\n",sizeof(bb));

列印結果是:

sizeof cc = 12

sizeof bb = 22

因為結構體struct n 沒有被巨集修飾,所以變數cc內部是按規則1來決定對齊方式,也就是按4位元組對齊。

struct s被巨集修飾,裡面的變數需要和巨集比較一下,才能得到各自的對齊方式。裡面的變數型別最少佔2位元組,

最多佔12位元組,所以裡面的變數都按2位元組對齊,整個結構體也按2位元組對齊。變數d雖然作為乙個整個,在

struct s裡面按2位元組對齊,但它內部還是按4位元組對齊,

因此變數d還是佔據12位元組。整個結構體一共佔22位元組。

3:當用

__attribute__ 巨集來

指定長度時,強制按照此值為結構體的有效對齊。

__attribute__是gnu c的特點,詳細請看

__attribute__只修飾該結構體整體,結構體內部的變數是不修飾的。

從連線裡面的

printf("

oo=%d,xx=%d \n

", sizeof(oo),sizeof

(xx));

列印結果還可以知道,雖然sizeof(oo)為8,也就是struct o佔8個位元組,但它是按4位元組對齊的。

4:位變數還沒研究,以後再補充。

C語言結構體 位元組對齊

目的 犧牲一點空間,換時間的效率 cpu執行效率 最終結構體大小一定是4的倍數 32bit系統 結構體裡成員變數順序不一致,也會影響結構體的大小 資料型別 32位機大小 位元組 64位機大小 位元組 char11 short22 int4 4long48 指標型別48 double88 float4...

C語言結構體的位元組對齊

在c語言中,結構是一種復合資料型別,其構成元素既可以是基本資料型別 如int long float等 的變數,也可以是一些復合資料型別 如陣列 結構 聯合等 的資料單元。在結構中,編譯器為結構的每個成員按其自然對界 alignment 條件分配空間。各個成員按照它們被宣告的順序在記憶體中順序儲存,第...

C語言結構體的位元組對齊

下面直接來看例子吧 測試環境為32位的系統 以下結構體分別佔多少位元組 struct a sizeof a 3 因為a b c按照1個位元組進行對齊 struct b sizeof b 8 按照4個位元組對齊 a佔4位元組 b佔乙個位元組 c佔2個位元組 有1個位元組剩餘 struct c size...