1. 程式人生 > >記憶體對齊的要素--資料成員對齊的規則

記憶體對齊的要素--資料成員對齊的規則

Data structure alignment refers to the way data is arranged and accessed in computer memory. It consists of three separate but related issues: data alignmentdata structure padding, and packing.

 

packing:對齊因子

The #pragma pack directive can only be used to reduce

 the packing size of a structure from the project default packing.

https://en.wikipedia.org/wiki/Data_structure_alignment

 

結構體的記憶體佈局依賴於CPU、作業系統、編譯器及編譯時的對齊選項。結構體內部成員的對齊要求,結構體本身的對齊要求。最重要的有三點

(一)成員對齊。對於結構體內部成員,通常會有這樣的規定:各成員變數存放的起始地址相對於結構的起始地址的偏移量必須為該變數的型別所佔用的位元組數的倍數。但是也可以看到,有時候某些欄位如果嚴格按照大小緊密排列,根本無法達到這樣的目的,因此有時候必須進行padding。各成員變數在存放的時候根據在結構中出現的順序依次申請空間,同時按照上面的對齊方式調整位置,空缺的位元組編譯器會自動填充也就是padding。

(二)然後,還要考慮整個結構體的對齊需求。ANSI C標準規定結構體型別的對齊要求不能比它所有欄位中要求最嚴格的那個寬鬆,可以更嚴格。實際上要求結構體至少是其中的那個最大的元素大小的整數倍。因為有時候我們使用的是結構體陣列,所以結構體的大小還得保證結構體陣列中各個結構體滿足對齊要求,同時獨立的結構體與結構體陣列中單個結構體的大小應當是一致的。

(三)編譯器的對齊指令。VC 中提供了#pragma pack(n)來設定變數以n位元組對齊方式。n位元組對齊就是說變數存放的起始地址的偏移量有兩種情況:第一、如果n大於等於該變數所佔用的位元組數,那麼偏移量必須滿足預設的對齊方式,第二、如果n小於該變數的型別所佔用的位元組數,那麼偏移量為n的倍數,不用滿足預設的對齊方式。結構的總大小也有個約束條件,分下面兩種情況:如果n大於所有成員變數型別所佔用的位元組數,那麼結構的總大小必須為佔用空間最大的變數佔用的空間數的倍數。

http://www.cnblogs.com/kevinLee-xjtu/archive/2011/12/12/2299090.html

 

首先我們要清楚結構體 struct中的成員在記憶體中的分配是連續的, struct內的首地址也就是 struct內第一個資料成員的地址,換句話說 struct內第一個資料成員離 struct開始的距離 offset = 0
   資料成員對齊的規則就是,而在第一個成員之後,每個成員距離struct首地址的距離 offset, 都是struct內成員自身長度(sizeof) 與 #pragma pack(n)中的n的最小值的整數倍,如果未經對齊時不滿足這個規則,在對齊時就會在這個成員前填充空子節以使其達到資料成員對齊。

作者:null122
連結:https://www.jianshu.com/p/49ddb946a226
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。