結構體位元組對齊的規則

2021-07-15 23:43:16 字數 1000 閱讀 6997

位元組對齊的計算規則

1、先看結構中最大型別的資料,包括巢狀結構體(如果有)。確定一行的最大數。

2、如果只有乙個元素,那就是這個元素的大小,不需要補齊。

4、巢狀子結構體則要看看這個元素的整個大小(就是累加的大小,不是對齊的大小)放到這一排的剩餘位置能不能放下,放不下則從下一行開始,子結構體中的元素排列規則和單一變數相同)

char(1),short(2),int(4),float(4),double(8),long(4)

例1struct a1;//大小為8

空間分布(8個位元組)aa

aabb

c1c2 例2

structa;

typedef

struct

bb;

空間分布(20個位元組)aa

aabx

xxef

fxgg

ggdx

xx 例3

structa;

typedef

struct

bb;

空間分布(32位元組) a

aaab

***e

ffxx

***g

gggg

gggd

dddd

ddd

結論:只有乙個元素:那就是這個元素的大小

多於兩個元素:先看所有元素中最大的是多少,確定一行到底有多少位元組,

再看每乙個元素能不能這一行完全放下(子結構體要看整個的大小),

放不下,另起一行開始放。最後乙個元素再填充補齊這一行

指定位元組對齊

#pragma pack(xx) //xx必須是2的n次方

#pragma pack(1) //1位元組對齊

#pragma pack(2) //2位元組對齊

#pragma pack(4) //4位元組對齊

#pragma pack(8) //8位元組對齊

#pragma pack(16) //16位元組對齊

參考文獻

結構體位元組對齊

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