struct 位元組對齊

2022-03-19 02:07:40 字數 947 閱讀 5232

轉貼:

1.資料型別自身的對齊值:就是上面交代的基本資料型別的自身對齊值。

2.指定對齊值:#progma pack (value)時的指定對齊值value。

3.結構體或者類的自身對齊值:其成員中自身對齊值最大的那個值。

4.資料成員、結構體和類的有效對齊值:自身對齊值和指定對齊值中小的那個值。

有了這些值,我們就可以很方便的來討論具體資料結構的成員和其自身的對齊方式。有效對齊值n是最終用來決定資料存放位址方式的值,最重要。有效對齊n,就是表示「對齊在n上」,也就是說該資料的"存放起始位址%n=0".而資料結構中的資料變數都是按定義的先後順序來排放的。第乙個資料變數的起始位址就是資料結構的起始位址。結構體的成員變數要對齊排放,結構體本身也要根據自身的有效對齊值圓整(就是結構體成員變數占用總長度需要是對結構體有效對齊值的整數倍,結合下面例子理解)。這樣就不能理解上面的幾個例子的值了。

例子分析:

分析例子b;

struct b

;假設b從位址空間0x0000開始排放。該例子中沒有定義指定對齊值,在筆者環境下,該值預設為4。第乙個成員變數b的自身對齊值是1,比指定或者預設指定對齊值4小,所以其有效對齊值為1,所以其存放位址0x0000符合0x0000%1=0.第二個成員變數a,其自身對齊值為4,所以有效對齊值也為4,所以只能存放在起始位址為0x0004到0x0007這四個連續的位元組空間中,複核0x0004%4=0,且緊靠第乙個變數。第三個變數c,自身對齊值為2,所以有效對齊值也是2,可以存放在0x0008到0x0009這兩個位元組空間中,符合0x0008%2=0。所以從0x0000到0x0009存放的都是b內容。再看資料結構b的自身對齊值為其變數中最大對齊值(這裡是b)所以就是4,所以結構體的有效對齊值也是4。根據結構體圓整的要求,0x0009到0x0000=10位元組,(10+2)%4=0。所以0x0000a到0x000b也為結構體b所占用。故b從0x0000到0x000b共有12個位元組,sizeof(struct b)=12;

struct與union位元組對齊問題

c 語言的一大優勢就是對記憶體空間的控制,當然,在物件導向語言的壓力下,程式設計師更喜歡輕鬆的語言,不喜歡自己還要顧慮記憶體空間。可是,c 語言仍然有很強的生命力,尤其是在作業系統 嵌入式系統這兩方面,因為要直接操作硬體,c語言就顯現出自己強大的體制 機制 邏輯優勢。c語言對記憶體控制,有乙個始終困...

如何讓struct不位元組對齊

下面我們使用預編譯指令 progma pack value 來告訴編譯器,使用我們指定的對齊值來取代預設的。progma pack 2 指定按2位元組對齊 struct c progma pack 取消指定對齊,恢復預設對齊 sizeof struct c 值是8。不位元組對齊的話 就設定 prog...

c c 裡struct位元組對齊規則

pragma pack n 編譯器用 n 來設定資料的對齊方式。預設32位os對齊位元組是4,64位對齊位元組是8。n 有可能影響結構體內部成員的對齊位置,以及結構體整體大小。對齊規則 規則一.每個成員變數在其結構體內的偏移量都是 min 對齊位元組,成員變數型別的大小 的倍數。規則二 如果有巢狀結...