計算結構體大小(位元組對齊)

2021-07-05 22:30:58 字數 2135 閱讀 1126

一,預設對齊方式

位元組對齊的細節和具體編譯器實現相關,但一般而言,滿足以下三個準則(也是vc預設對齊方式):

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

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

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

二,使用者自定義對齊方式

修改對齊方式:

1,靜態修改:在vs ide中,通過project -> settings -> c/c++ -> category:code generation -> struct member alignment進行修改,預設為8位元組。

2,動態修改:vc中提供了#pragma pack(n)來設定變數以n位元組對齊,n的取值一般為2^n(n>=0)。

n位元組對齊就是說變數存放的起始位址相對於結構體首位址的偏移量有兩種情況:

1,如果n大於等於該變數所占用的位元組數,那麼偏移量必須滿足預設的對齊方式;

2,如果n小於該變數的型別所占用的位元組數,那麼偏移量為n的倍數,不用滿足預設的對齊方式。

結構體的總大小也分兩種情況:

1,如果n大於等於所有成員變數型別所占用的位元組數,那麼結構體的總大小必須為占用空間最大的變數占用的空間數的整數倍(預設對齊方式);

2,否則必須為n的整數倍。

自定義對齊方式計算原則:按佔位小的來算。每個成員按其型別的對齊引數(通常是這個型別的大小)和指定對齊引數(n)中較小的乙個對齊。若n大於等於佔位最大的元素,則按預設對齊方式計算,若n小於佔位最大的元素,則按n計算。

eg://#pragma pack(push)

#pragma pack(4)// mystruct1按自定義對齊方式計算,n等於4

typedef struct mystruct1

mystruct1;

//#pragma pack(pop)

#pragma pack() //mystruct2按預設對齊方式計算

typedef struct mystruct2

mystruct2;

sizeof(mystruct1)結果為16

sizeof(mystruct2)結果為24

mystruct1的記憶體布局:1***,11111111,1111 //a, b, c

mystruct2的記憶體布局:1*******,11111111,1111**** //a, b, c

三,複雜型別(如結構)的預設對齊方式

複雜型別(如結構)的預設對齊方式是它最長的成員的對齊方式,而不是按其總大小來計算對齊,這樣在成員是複雜型別時,可以最小化長度。

eg1:

#pragma pack(8)

struct s1

s1;struct s2

s2;#pragma pack() //恢復預設對齊方式

sizeof(s1)結果為8

sizeof(s2)結果為24

s1的記憶體布局:1***,1111 //a, b

s2的記憶體布局:1***,1***,1111,****11111111 //c, d.a, d.b, e

分析:s2 中,c和s1中的a一樣,按1位元組對齊,而d 是個結構體,它共佔8個位元組,它按什麼對齊呢?對於結構體來說,它的預設對齊方式就是它的所有成員使用的對齊引數中最大的乙個,s1中成員的最大對齊引數為4,所以結構體d按4位元組對齊。成員e佔8個位元組,它預設按8位元組對齊,和指定的一樣(n=8),所以它對到8位元組整數倍的邊界上。之前已經使用了12個位元組了,所以需填充4個位元組,從第16個位元組開始放置成員e。這時長度為24,已經可以被8(成員e按8位元組對齊)整除。這樣一共使用了24個位元組。

eg2:

//預設對齊方式

union u

u; //聯合體各成員首位址相對於聯合體首位址的偏移量均為0

struct s

s;sizeof(u)結果為12

sizeof(s)結果為32

u記憶體布局:1*********** //a 或 1111******** //b 或 1111111111** //c

s記憶體布局:1*******,11111111,1111111111**,1111 //d, e, f, g //設f此時儲存的為成員c

sizeof計算結構體大小(位元組對齊)

引言 sizeof計算結構體的大小經常出現在筆試題中,接下來是對它的一些總結 pragma pack 8 struct s1 struct s2 求sizeof s2 的值?32位機 解 1.先看s1,a的有效對齊值為min 2,8 2,偏移量為0,0 2 0,符合 b的有效對齊值為min 4,8 ...

位元組對齊與結構體大小

先讓我們看四個重要的基本概念 1.資料型別自身的對齊值 對於char型資料,其自身對齊值為1,對於short型為2,對於int,float,double型別,其自身對齊值為4,單位位元組。2.結構體或者類的自身對齊值 其成員中自身對齊值最大的那個值。3.指定對齊值 pragma pack value...

結構體位元組對齊

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