1. 程式人生 > >結構體對齊總結

結構體對齊總結

結構體對齊

結構體對齊到底是什麼,看了網上很多的解答,彙總成個人經驗

在計算機記憶體中,結構體變數的儲存通常是按字長對齊的,
比如8位機裡就按位元組對齊;
16位機中,變數就按照2位元組對齊;
32位機中,變數就按照4位元組對齊;
64位機中,變數就按照8位元組對齊;

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

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

什麼是結構體對齊

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

結構體對齊規則

1.第一個資料成員放在offset為0的地方;
2.結構體成員在記憶體中順序存放,所佔記憶體地址依次增高,第一個成員處在低地址處,最後一個成員處在高地址處,但結構體成員之間的記憶體分配不一定是連續的
3. 第二個以及以後的每個資料成員儲存的起始位置,要從 N= min(sizeof(成員型別),X)的整數倍開始(比如double在32位機為8位元組,則要從4的整數倍地址開始儲存);
4. 整個結構體的長度必須是各成員所使用的對齊引數N中最大的那個值的整數倍
即總長度LEN= {max(N1,N2,……,N)}的最小整數倍;
5. 如果一個結構裡有某些結構體成員,仍按照原來順序規則計算,但結構體成員要從 N= min(sizeof(成員型別),X)的整數倍地址開始儲存。(struct a裡存有struct b,b裡有char,int,double等元素(8位元組),那b應該從8的整數倍開始儲存);

考慮一個問題,為什麼要設計記憶體對齊的處理方式呢?

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

ENDING

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