C 結構變數資料對齊問題

2022-08-16 08:54:09 字數 1547 閱讀 6414

為了避免混淆。做例如以下規定,下面**若不加特殊說明都執行於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(num)

num是結構體的對齊值,比方以下的樣例按四個位元組對齊。

#pragma pack(4)

#pragma pack(show)

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

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

C 結構變數資料對齊問題

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

C 變數對齊

編譯器要對c 進行編譯時需要按照相應的型別為變數分配記憶體空間,最為人們熟知的就是那五個空間了 棧,堆,全域性資料區,常量區和 區。現在知道了哪些變數存放在哪些空間裡了,但是在相應的空間裡又是如何存放的呢?相信很多人都已經知道了,我也知道了。對齊方式有三種規則,看網上已經很詳細了,我還是想用自己的話...

C語言結構體對齊 記憶體對齊問題

c語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。內容雖然很基礎,但一不小心就會弄錯。寫出乙個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?有人給對齊原則做過總結,具體在 看到現在已記不起來,這裡引用一下前人...