struct記憶體布局

2021-06-06 09:28:15 字數 1683 閱讀 9815

結構體的記憶體分配原則
原則1、資料成員對齊規則:結構(struct或聯合union)的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍位址開始儲存)。
原則2、結構體作為成員:如果乙個結構裡有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍位址開始儲存。(struct a裡存有struct b,b裡有char,int,double等元素,那b應該從8的整數倍開始儲存。)

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

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

例1:struct a;

structb;

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

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

例2:struct a;

struct b;

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 c

a的記憶體布局:1111, 1*, 11

b 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:struct a;

struct b;

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

a                         b                  c   

a的記憶體布局:1111, * * * *, 1111, 1111, 1111, * * * *

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

e f g h i

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

i其實就是a的記憶體布局。i的起始位置要為8的倍數,所以h後面要補齊。把b的記憶體布局弄清楚,有關結構體的對齊方式基本就算掌握了。

原文引自:

struct的記憶體布局

這段 的輸出結果是多少?4 1 5?那你就錯了 是8!為了cpu取數方便,提高效率,編譯器一般會把資料安排到合適的位置 一般數在記憶體中存放的起始位址都是4的倍數,稱為 4位元組對齊 所以在這裡,char雖然只佔1位元組,但是後面也給它填充3個位元組,湊夠4個位元組 struct s struct ...

解析struct的記憶體布局

在平時開發過程中,我們常用map string struct 來實現乙個set,用struct 的原因是struct 不占用記憶體空間,為什麼空struct會不占用記憶體空間?對於自定義的struct的記憶體空間的占用是什麼樣的?struct和j a中的物件類似,在記憶體中都是一塊連續的空間,在j ...

struct記憶體對齊

出於速度和空間的考量,編譯器在實現過程中均會採用對struct內的變數進行記憶體對齊的操作,雖然會有一定的空間浪費,卻可以減少在讀取資料時候的讀取操作。先看下面的例子 struct a int main struct b int main struct b int main struct a str...