內存對齊的要素--數據成員對齊的規則
Data structure alignment refers to the way data is arranged and accessed in computer memory. It consists of three separate but related issues: data alignment, data 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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並註明出處。
內存對齊的要素--數據成員對齊的規則