C C 資料對齊

2021-06-25 21:07:11 字數 2381 閱讀 2495

為了避免混淆,做如下規定,以下**若不加特殊說明都執行於32位平台,結構體的預設對齊值是8,各資料型別所佔位元組數分別為

char佔乙個位元組

int佔四個位元組

double佔八個位元組。

請問下面的結構體大小是多少?

struct

test

;

這個呢?

struct

test1

;

在公布答案之前先看一下對齊的規則。

一般來說,結構體的對齊規則是先按資料型別自身進行對齊,然後再按整個結構體進行對齊,對齊值必須是2的冪,比如1,2, 4, 8, 16。如果乙個型別按n位元組對齊,那麼該型別的變數起始位址必須是n的倍數。比如int按四位元組對齊,那麼int型別的變數起始位址一定是4的倍數,比如0x0012ff60,0x0012ff48等。

資料自身的對齊值通常就是資料型別所佔的空間大小,比如int型別佔四個位元組,那麼它的對齊值就是4

整個結構體的對齊值一般是結構體中最大資料型別所佔的空間,比如下面這個結構體的對齊值就是8,因為double型別佔8個位元組。

struct

test2

;

有了上面的基礎,再回過頭去看看一開始的兩個例子

先看結構體test

1 c是char型別,按1個位元組對齊

2 i是int型別,按四個位元組對齊,所以在c和i之間實際上空了三個位元組。

整個結構體一共是1 + 3(補齊)+ 4 = 8位元組。

再看test1

i是int型別,按4位元組對齊

d是double型別,按8位元組對齊,所以i和d之間空了4位元組

c是char型別,按1位元組對齊。

所以整個結構體是 4(i) + 4(補齊)+ 8(d) + 1(c) =  17位元組,注意!還沒完,整個結構體還沒有對齊,因為結構體中空間最大的型別是double,所以整個結構體按8位元組對齊,那麼最終結果就是17 + 7(補齊) = 24位元組。

我們對test1做一點改動

struct

test1

;

這時test1的大小就變成了16,而不是24了,節省了8個位元組!可見結構體中成員的書寫順序對結構體大小的影響還是很大的,乙個好的建議是,按照資料型別由小到大的順序進行書寫。

#pragma pack(show)

該命令來檢視當前的對齊值,但是要注意的是,結果是以warning的形式輸出的,所以要在vs的警告視窗中才看得見,如下

warning c4810: value of pragma pack(show) == 8   

projects-properties-configuration properties-c/c++-code generation-struct member alignment, 如果沒有修改過,則預設值是default,即8位元組對齊。

#pragma pack(num)

num是結構體的對齊值,比如下面的例子按四個位元組對齊。

#pragma pack(4)

projects-properties-configuration properties-c/c++-code generation

引用 ownwaterloo:

引用資料自身的對齊值就是資料型別所佔的空間大小,比如int型別佔四個位元組,那麼它的對齊值就是4

常見的誤解。

對任意型別 sizeof(t)是alignof(t)的倍數。

但sizeof(t)不一定總是等於alignof(t), 即使對基本型別也不一定。

有個不成文的規定是alignof(t)是2的整數次冪。

比如gcc的long double是12位元組, 為了是2的整數次冪, 就只能是按4位元組對齊。

另外,gcc有單獨的選項控制long long 和double(大小都是8位元組)的對齊, 4位元組或8位元組。

多謝提醒!

引用digdeep126:

"因為結構體中空間最大的型別是double,所以整個結構體按8位元組對齊"

這個說法不對!

因為:struct d;

sizeof(struct d) == 12 != 16

好好看看我文章前面的說明!預設8位元組對齊!而且最後整個結構體的大小必須是這個值得整數倍。

zhupeiru

引用

#pragma pack(2)

struct c

;struct d

;#pragma pack(4)

struct e

;int main()

{cout<

因為c和d都是按2位元組對齊,所以size(c) + size(d) = 8 + 2 = 10

為什麼是12呢?

c c 資料對齊

為了避免混淆,做如下規定,以下 若不加特殊說明都執行於32位平台,結構體的預設對齊值是8,各資料型別所佔位元組數分別為 char佔乙個位元組 int佔四個位元組 double佔八個位元組。請問下面的結構體大小是多少?struct test 複製 這個呢?struct test1 複製 在公布答案之前...

C C 資料對齊

為了避免混淆,做如下規定,以下 若不加特殊說明都執行於32位平台,結構體的預設對齊值是8,各資料型別所佔位元組數分別為 char佔乙個位元組 int佔四個位元組 double佔八個位元組。請問下面的結構體大小是多少?struct test 這個呢?struct test1 在公布答案之前先看一下對齊...

C C 資料對齊

為了避免混淆,做如下規定,以下 若不加特殊說明都執行於32位平台,結構體的預設對齊值是8,各資料型別所佔位元組數分別為 char佔乙個位元組 int佔四個位元組 double佔八個位元組。請問下面的結構體大小是多少?struct test 這個呢?struct test1 在公布答案之前先看一下對齊...