C 結構體的記憶體對齊原則

2021-10-02 22:53:46 字數 1399 閱讀 7585

什麼是結構體?

結構體也是一種資料型別,但不是基本資料型別(如int、floatc中內建的型別)而是一種聚合(aggregate)型別,它的成員是基本資料型別或其它已定義的型別或自身型別的指標。

對結構體的基本概念有了大概認識後,就要進一步了解它在記憶體中的實現,而結構體的記憶體實現與記憶體對齊原則相關。在這之前可以先聯想陣列的記憶體實現

陣列

考慮**:

int

main

(void);

//後面7個元素被初始化為值0

printf

("&a[0]:%x\n"

"&a[1]:%x\n"

"&a[2]:%x\n"

,&int_arr[0]

,&int_arr[1]

,&int_arr[2]

);return0;

}

輸出:

&a[0]:22fe20

&a[1]:22fe24

&a[2]:22fe28

記憶體中每個元素佔4個儲存單元(4位元組),4個儲存單元的位置是緊挨著的。

陣列的記憶體實現——用一組連續的儲存單元儲存陣列中的資料,邏輯上相鄰的陣列元素在記憶體位置上是相鄰的。

結構體

考慮**:

struct block

;int

main

(void);

;printf

("&test:%x\n"

"&test.part1:%x\n"

"&test.part2:%x\n"

,&test,

&test.part1,

&test.part2)

;printf

("sizeof(int):%d\n"

,sizeof

(int))

;return0;

}

輸出結果:

&test:22fe40

&test.part1:22fe40

&test.part2:22fe44

sizeof(int):4

結論:在記憶體中,結構體變數test的起始位址與其成員part1的位址相同,但成員part2並不是緊鄰於成員part1,而是相隔4個位元組。這是因為結構體的記憶體對齊原則結構體成員的起始位址相對於結構體起始位址的偏移量是結構體成員自身所佔記憶體大小的整數倍。可以理解成:這個位址偏移量對齊(整數倍)成員自身的大小。

可以計算:part2的位址減去test的位址,得到4(單位位元組),剛好是int型別大小的一倍。

C結構體的記憶體對齊

pack 可以指定記憶體對齊值,單位是位元組,這個是值需要時2的次冪 1,2,4,6,8 如不設定也有預設值,這個值我理解的是作業系統的字長。pragma pack 8 結構體第乙個成員放在struct offset 0 的位置。計算每個成員的對齊值,計算方式 min size 成員 預設對齊值 計...

結構體對齊(記憶體對齊

有的時候,在腦海中停頓了很久的 顯而易見 的東西,其實根本上就是錯誤的。就拿下面的問題來看 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,複雜型別中各個成員按照它們被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個型別的位...