結構體位元組對齊

2021-06-20 15:54:40 字數 1261 閱讀 4926

1、32位機

char 佔1位元組

short 佔2位元組

int    佔4位元組

long  佔4位元組

float   佔4位元組

double 佔8位元組

long long 佔8位元組

2、結構體的對齊值n:各成員中佔最大位元組者位元組數與用 #pragma pack(value) 的value 兩者中的小者,若未用 #pragma pack(value)指定,則為成員佔最大位元組值。

3、成員對齊值m:成員所佔位元組數與n中的小者

4、最終結構體所佔位元組數為n的倍數

結構體對齊:所佔總位元組數為n的倍數

若結構體中巢狀有結構體,n的預設值由結構體中各「原子型別」所佔位元組數確定。

位域對齊:

有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位(乙個位元組8個二進位制位)。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為「位域」或「位段」。所謂「位域」是把乙個位元組中的二進位劃分為幾個不同的區域, 並說明每個區域的位數。每個域有乙個網域名稱,允許在程式中按網域名稱進行操作。 這樣就可以把幾個不同的物件用乙個位元組的二進位制位域來表示。

注意:乙個位域必須儲存在同乙個位元組中,不能跨位元組。乙個位域必須儲存在同乙個位元組中,不能跨兩個位元組。如乙個位元組所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。(從這裡也能看出乙個位域不能超過8)。

4.含位域結構體內存對齊:

a. 如果相鄰位域型別相同,位寬之和小於型別的sizeof大小,則後面的字段緊鄰前乙個字段儲存,直到不能容納為止;

b. 如果相鄰位域型別相同,位寬之和大於型別的sizeof大小,則後面的字段將從新的儲存單元開始,其偏移量為其型別大小的整數倍;

c. 如果相鄰位域型別不用,則vc6採取不壓縮方式,dev-c++ 和gcc都採取壓縮方式。

5. 非壓縮儲存:

struct t0

;cout << "struct t0 = " << sizeof(t0) << endl; //dev c++:4  vc6:8

依然要滿足不含位域結構體內存對齊準則第2條,i成員相對於結構體首位址的偏移應該是4的整數倍,所以c成員後要填充3個位元組,然後再開闢4個位元組的空間作為int型,其中4位用來存放i,所以上面結構體在vc中所佔空間為8個位元組;而對於採用壓縮方式的編譯器來說,遵循不含位域結構體內存對齊準則第2條,不同的是,如果填充的3個位元組能容納後面成員的位,則壓縮到填充位元組中,不能容納,則要單獨開闢空間,所以上面結構體t0在gcc或者dev-c++中所佔空間應該是4個位元組。

結構體位元組對齊

include pragma pack 2 struct t.pragma pack int main int argc,char argv 最後輸出的結果為 8。這個表示是按照2位元組來對齊資料,首先分配2位元組給成員變數i,分配完成後,還剩一位元組,zj add補0 沒法容納成員變數d,此時會再...

結構體位元組對齊

include pragma pack 2 struct t.pragma pack int main int argc,char argv 最後輸出的結果為 8。這個表示是按照2位元組來對齊資料,首先分配2位元組給成員變數i,分配完成後,還剩一位元組,zj add補0 沒法容納成員變數d,此時會再...

結構體位元組對齊

在用sizeof運算子求算某結構體所佔空間時,並不是簡單地將結構體中所有元素各自佔的空間相加,這裡涉及到記憶體位元組對齊的問題。從理論上講,對於任何 變數的訪問都可以從任何位址開始訪問,但是事實上不是如此,實際上訪問特定型別的變數只能在特定的位址訪問,這就需要各個變數在空間上按一定的規則排列,而不是...