1、平台原因(移植原因):
不是所有的硬體平台都能訪問任意位址上的任意資料的;
某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。
2、效能原因:資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。
原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。
另外:《windows核心程式設計》裡這樣說:當cpu訪問正確對齊的資料時,它的執行效率最高,當資料大小的資料模數的記憶體位址是0時,資料是對齊的。例如:word值應該是總是從被2除盡的位址開始,而dword值應該總是從被4除盡的位址開始,資料對齊不是記憶體結構的一部分,而是cpu結構的一部分。當cpu試圖讀取的數值沒有正確的對齊時,cpu可以執行兩種操作之一:產生乙個異常條件;執行多次對齊的記憶體訪問,以便讀取完整的未對齊資料,若多次執行記憶體訪問,應用程式的執行速度就會慢。在最好的情況下,是兩倍的時間,有時更長。
1.第乙個成員在與結構體變數偏移量為0的位址處。
2.其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。
注意: 對齊數 = 編譯器預設的乙個對齊數 與 該成員大小的較小值。
vs中預設的值為8
linux中的預設值為4
3.結構體總大小為最大對齊數(每個成員變數除了第乙個成員都有乙個對齊數)的整數倍。
4.如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的
整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對
齊數)的整數倍。
其他:
指定對齊值:#pragma pack (value)時的指定對齊值value。
#pragma pack () /取消指定對齊,恢復預設對齊/
對其方式
定義乙個空結構體,那麼,這個結構體占多大空間呢?
在c中,空結構的大小為0。
在c++中,空結構的大小則為1。
為什麼 編譯器輸出的結果為1呢?例項化的原因(空類同樣可以被例項化),每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目的,編譯器往往會給乙個空類隱含的加乙個位元組,這樣空類在例項化後在記憶體得到了獨一無二的位址.所以空類的大小為1.
結構體對齊方式
對齊的作用和原因 各個硬體平台對儲存空間的處理上有很大的不同。一些平台對某些特定型別的資料只能從某些特定位址開始訪問。其他平台可能沒有這種情況,但是最常見的是如果不按照適合其平台要求對資料存放進行對齊,會在訪問效率上帶來損失。語法 pragma pack show push pop identifi...
結構體對齊詳解
include struct a int main struct b 現在已知32位機器上各種資料型別的長度如下 char 1 有符號無符號同 short 2 有符號無符號同 int 4 有符號無符號同 long 4 有符號無符號同 float 4 double 8 那麼上面兩個結構大小如何呢?結果...
結構體對齊計算方式
結構體的大小也不是成員型別大小的簡單相加。需要考慮到系統在儲存結構體變數時的位址對齊問題。由於儲存變數位址對齊的問題,結構體大小計算必須滿足兩條原則 一 結構體成員的偏移量必須是成員大小的整數倍 0被認為是任何數的整數倍 二 結構體大小必須是所有成員大小的整數倍 陣列除外,結構體中的結構體按單個變數...