結構體儲存記憶體對齊

2021-07-16 09:52:05 字數 2037 閱讀 8307

**:

解析c語言結構體對齊(記憶體對齊問題)

結構體對齊原因有很大部分是因為計算機掃瞄的記憶體單元個數,也就是資料匯流排的大小。

原則1:資料成員對齊規則:結構(struct或聯合union)的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍位址開始儲存)。

原則2:結構體作為成員:如果乙個結構裡有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍位址開始儲存。(structa裡存有struct b,b裡有char,int,double等元素,那b應該從8的整數倍開始儲存。)

原則3:收尾工作:結構體的總大小,也就是sizeof的結果,必須是其內部最大成員的整數倍,不足的要補齊。

這三個原則具體怎樣理解呢?我們看下面幾個例子,通過例項來加深理解。

例1:structa;

structb;

sizeof(a)= 6; 這個很好理解,三個short都為2。

sizeof(b)= 8; 這個比是不是比預想的大2個位元組?long為4,short為2,整個為8,因為原則3。

例2:structa;

structb;

sizeof(a) = 8; int為4,char為1,short為2,這裡用到了原則1和原則3。

sizeof(b) = 12; 是否超出預想範圍?char為1,int為4,short為2,怎麼會是12?還是原則1和原則3。

深究一下,為什麼是這樣,我們可以看看記憶體裡的布局情況。

a b 

ca的記憶體布局:1111, 

1*, 

11b a c

b的記憶體布局:1***, 

1111, 

11**

其中星號*表示填充的位元組。a中,b後面為何要補充乙個位元組?因為c為short,其起始位置要為2的倍數,就是原則1。c的後面沒有補充,因為b和c正好占用4個位元組,整個a占用空間為4的倍數,也就是最大成員int型別的倍數,所以不用補充。

b中,b是char為1,b後面補充了3個位元組,因為a是int為4,根據原則1,起始位置要為4的倍數,所以b後面要補充3個位元組。c後面補充兩個位元組,根據原則3,整個b占用空間要為4的倍數,c後面不補充,整個b的空間為10,不符,所以要補充2個位元組。

再看乙個結構中含有結構成員的例子:

例3:structa;

structb;

sizeof(a) = 24;這個比較好理解,int為4,double為8,float為4,總長為8的倍數,補齊,所以整個a為24。

a               b              c

1111****,11111111,11******

(a佔4位元組,b佔8位元組,b開始的位置要是自己的整數倍,所以b要在結構體指標為x%8=0的地方,因為a只佔到了4,所以順延的第乙個適合的位置為8,b的起始位置為8,前面補齊;c為4,開始位置要在x%4=0的位置,前面為16位,指標位置15,第16位為順延的第乙個合適位置,所以c開始位置為16,又因為結構體大小是整個結構體最大元素長度的整數倍,所以c的後面要補齊6位(個人見解 *——*))

sizeof(b) = 48; 看看b的記憶體布局。

e f 

g h 

i b的記憶體布局:11* *,1111, 

11111111, 11 * * * * **,1111* * * *, 11111111, 1111 * * * *

省略巨集與結構體中含位域字段兩種情況說明,祥見原文。

考慮乙個問題,為什麼要設計記憶體對齊的處理方式呢?如果體系結構是不對齊的,成員將會乙個挨乙個儲存,顯然對齊更浪費了空間。那麼為什麼要使用對齊呢?體系結構的  對齊和不對齊,是在時間和空間上的乙個權衡。對齊節省了時間。假設乙個體繫結構的字長為w,那麼它同時就假設了在這種體系結構上對寬度為w的資料的處理最頻繁也是最重要的。它的設計也是從優先提高對w位資料操作的效率來考慮的。有興趣的可以google一下,人家就可以跟你解釋的,一大堆的道理。

最後順便提一點,在設計結構體的時候,一般會尊照乙個習慣,就是把占用空間小的型別排在前面,占用空間大的型別排在後面,這樣可以相對節約一些對齊空間。

結構體對齊(記憶體對齊

有的時候,在腦海中停頓了很久的 顯而易見 的東西,其實根本上就是錯誤的。就拿下面的問題來看 structt 使用sizeof t 將得到什麼樣的答案呢?要是以前,想都不用想,在32位機中,int是4個位元組,char是1個位元組,所以t一共是5個位元組。實踐出真知,在vc6中測試了下,答案確實8個位...

記憶體對齊 結構體對齊

現在已知32位機器上各種資料型別的長度如下 char 1 有符號無符號同 short 2 有符號無符號同 int 4 有符號無符號同 long 4 有符號無符號同 float 4 double 8 重要規則 1,複雜型別中各個成員按照它們被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個型別的位...

結構體的記憶體對齊

原則一 結構體中元素是按照定義順序乙個乙個放到記憶體中去的,但並不是緊密排列的。從結構體儲存的首位址開始,每乙個元素放置到記憶體中時,它都會認為記憶體是以它自己的大小來劃分的,因此元素放置的位置一定會在自己寬度的整數倍上開始 以結構體變數首位址為0計算 原則二 在經過第一原則分析後,檢查計算出的儲存...