一:為什麼存在記憶體對齊
1.平台原因(移植原因): 不是所有的硬體平台都能訪問任意位址上的任意資料的;某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。
2. 效能原因: 資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。 原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。
總的來說結構體的記憶體對齊是拿空間來換取時間的做法。
二:結構體的記憶體對齊四規則
預設情況:預設的對齊值 8位元組
1.基本資料型別有乙個對齊值
2.自定義型別有乙個對齊值 = 內部成員型別的最大值
3.程式的指定對齊值:#pragma pack(n) n == 2的冪次方 n可以等於2 4 8 16 …
4.程式的有效對齊值:程式的指定對齊值和資料型別對齊值得較小值
三:舉例
例1
typedef
struct test //8
test;
void
main()
分析:char型別佔乙個位元組,double型別佔八個位元組,int佔四個位元組;根據其對齊規則,內部成員型別的最大值為double(8個位元組),所以char型別要補齊另外的七個位元組,加上int的四個位元組,一共是:1+7+8+4 = 20,此時20不是8的倍數,因此int要補四個位元組。
結果:
例2
typedef
struct test //8
test;
void
main()
***分析同上
結果:***
例3
typedef
struct test
;int e;
//4 + 4
}test;
void
main()
結果:
例4 程式中有指定對齊值時
#pragma pack(2)
typedef
struct test
;//14
int e;
//4}test;
void
main()
結果: C結構體的記憶體對齊
pack 可以指定記憶體對齊值,單位是位元組,這個是值需要時2的次冪 1,2,4,6,8 如不設定也有預設值,這個值我理解的是作業系統的字長。pragma pack 8 結構體第乙個成員放在struct offset 0 的位置。計算每個成員的對齊值,計算方式 min size 成員 預設對齊值 計...
結構體對齊(記憶體對齊
有的時候,在腦海中停頓了很久的 顯而易見 的東西,其實根本上就是錯誤的。就拿下面的問題來看 structt 使用sizeof t 將得到什麼樣的答案呢?要是以前,想都不用想,在32位機中,int是4個位元組,char是1個位元組,所以t一共是5個位元組。實踐出真知,在vc6中測試了下,答案確實8個位...
記憶體對齊 結構體對齊
現在已知32位機器上各種資料型別的長度如下 char 1 有符號無符號同 short 2 有符號無符號同 int 4 有符號無符號同 long 4 有符號無符號同 float 4 double 8 重要規則 1,複雜型別中各個成員按照它們被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個型別的位...