結構體對齊總結

2021-08-30 13:20:00 字數 1023 閱讀 9232

在計算機記憶體中,結構體變數的儲存通常是按字長對齊的,

比如8位機裡就按位元組對齊;

16位機中,變數就按照2位元組對齊;

32位機中,變數就按照4位元組對齊;

64位機中,變數就按照8位元組對齊;

在大多數計算機體系結構中,對記憶體操作時按整字訪問才能達到最高效率,雖然有一些位元組是浪費掉的,但是以空間換取了更快的訪問速度。

為了在時間空間上達到統一,在設計結構體的時候,把占用空間小的型別排在前面,占用空間大的型別排在後面,這樣可以相對節約一些對齊空間。

在大多數計算機體系結構中,對記憶體操作時按整字訪問才能達到最高效率,相當於是以空間換取時間

1.第乙個資料成員放在offset為0的地方;

2.結構體成員在記憶體中順序存放,所佔記憶體位址依次增高,第乙個成員處在低位址處,最後乙個成員處在高位址處,但結構體成員之間的記憶體分配不一定是連續的

3. 第二個以及以後的每個資料成員儲存的起始位置,要從 n= min(sizeof(成員型別),x)的整數倍開始(比如double在32位機為8位元組,則要從4的整數倍位址開始儲存);

4. 整個結構體的長度必須是各成員所使用的對齊引數n中最大的那個值的整數倍

即總長度len= 的最小整數倍;

5. 如果乙個結構裡有某些結構體成員,仍按照原來順序規則計算,但結構體成員要從 n= min(sizeof(成員型別),x)的整數倍位址開始儲存。(struct a裡存有struct b,b裡有char,int,double等元素(8位元組),那b應該從8的整數倍開始儲存);

如果體系結構是不對齊的,成員將會乙個挨乙個儲存,顯然對齊更浪費了空間。那麼為什麼要使用對齊呢?體系結構的對齊和不對齊,是在時間和空間上的乙個權衡。對齊節省了時間。假設乙個體繫結構的字長為w,那麼它同時就假設了在這種體系結構上對寬度為w的資料的處理最頻繁也是最重要的。它的設計也是從優先提高對w位資料操作的效率來考慮的。

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

結構體對齊

現在去掉第乙個成員變數為如下 pragma pack 4 class testc int nsize sizeof testc 按照正常的填充方式nsize的結果應該是8,為什麼結果顯示nsize為6呢?事實上,很多人對 pragma pack的理解是錯誤的。pragma pack規定的對齊長度,實...

結構體對齊

結構體對齊問題 以下結論均在gnu gcc上驗證 概念 偏移量 成員位址相對結構體位址的偏移 對齊原則 1.結構體中某成員的偏移量必須是該成員型別大小的整數倍 b 的偏移量必須是 short 大小的整數倍,故在 a 後面填充乙個位元組 c 的 型別大小是double,在ansi c中,c 的偏移量是...

結構體對齊

結構體對齊方式 1.pragma pack x 32系統預設值4,結構體元素最大長度,取三者最小值,作為每個元素對齊計算的值的倍數,並且總和是最小值的倍數!假的 於2015 12 26 修改 1.資料成員對齊原則 結構或聯合的資料成員,第乙個資料成員放在offset為0的地方,以後每個成員按照 pr...