C程式中結構體的記憶體對齊

2021-10-05 04:29:17 字數 1731 閱讀 2954

一:為什麼存在記憶體對齊

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,複雜型別中各個成員按照它們被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個型別的位...