C語言 結構體位元組對齊問題

2022-02-06 04:47:55 字數 931 閱讀 3168

方法一:

結構體在記憶體中分配一塊連續的記憶體,但結構體內的變數並不一定是連續存放的,這涉及到記憶體對齊。

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

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

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

方法二:

struct的記憶體大小為每個資料記憶體的加和,首先按照最大的資料型別進行單個分配如果前乙個資料占用不了所有的記憶體,而剩下的記憶體可以放下下乙個資料則第二個資料不另外分配記憶體(但是位址必須是從這個資料型別大小的整數倍開始,看下面的struct c),否則重新分配乙個最大型別的記憶體

例題,即指標佔64位,8個位元組。

所以,*p所佔的記憶體是這要的:

a【0-7】:本身佔1個位元組,因原則1,d起始位置需要是8的倍數,於是位元組對齊佔7個位元組,共8個位元組

d【8-15】:64位指標,佔8位元組

b【16-19】:佔32位,4個位元組

c:16 【20-23】:佔16位,2個位元組,因原則1,e起始位置需要是8的倍數,於是位元組對齊佔2個位元組,共4個位元組

e【24-32】:64位,8個位元組

8 + 8 + 4 + 4 + 8 = 32

C語言結構體 位元組對齊

目的 犧牲一點空間,換時間的效率 cpu執行效率 最終結構體大小一定是4的倍數 32bit系統 結構體裡成員變數順序不一致,也會影響結構體的大小 資料型別 32位機大小 位元組 64位機大小 位元組 char11 short22 int4 4long48 指標型別48 double88 float4...

結構體位元組對齊問題

結構體 struct 的sizeof值,並不是簡單的將其中各元素所佔位元組相加,而是要考慮到儲存空間的位元組對齊問題。先看下面定義的兩個結構體.struct s1 struct s2 分別用程式測試得出sizeof s1 6 sizeof s2 4 可見,雖然兩個結構體所含的元素相同,但因為其中存放...

C語言結構體的位元組對齊

在c語言中,結構是一種復合資料型別,其構成元素既可以是基本資料型別 如int long float等 的變數,也可以是一些復合資料型別 如陣列 結構 聯合等 的資料單元。在結構中,編譯器為結構的每個成員按其自然對界 alignment 條件分配空間。各個成員按照它們被宣告的順序在記憶體中順序儲存,第...