C 記憶體對齊

2021-06-02 12:44:38 字數 1284 閱讀 6079

c++中的記憶體對齊

記憶體對齊

在我們的程式中,資料結構還有變數等等都需要占有記憶體,在很多系統中,它都要求記憶體分配的時候要對齊,這樣做的好處就是可以提高訪問記憶體的速度。

我們還是先來看一段簡單的程式:

程式一 1

#include  2

using

namespace

std; 3

4structx1

5; 10

11structx2

12; 17

18structx3

19; 24

intmain() 25

這段程式的功能很簡單,就是定義了三個結構

x1,x2,x3,

這三個結構的主要區別就是記憶體資料擺放的順序,其他都是一樣的,另外程式輸入了幾種基本型別所占用的位元組數,以及我們這裡的三個結構所占用的位元組數。

這段程式的執行結果為:

1long4

2float4

3int4

4char1

5x1 

的大小8 6

x2 的大小12

7x3 

的大小8

結果的前面四行沒有什麼問題,但是我們在最後三行就可以看到三個結構占用的空間大小不一樣,造成這個原因就是內部資料的擺放順序,怎麼會這樣呢?

下面就是我們需要講的記憶體對齊了。

記憶體是乙個連續的塊,我們可以用下面的圖來表示

,  它是以

4個位元組對乙個對齊單位的:

讓我們看看三個結構在記憶體中的布局:

x1 中第乙個是 int型別,它占有4位元組,所以前面4格就是滿了,然後第二個是char型別,這中型別只佔乙個位元組,所以它占有了第二個4位元組組塊中的第一格,第三個也 是char型別,所以它也占用乙個位元組,它就排在了第二個組塊的第二格,因為它們加在一起大小也不超過乙個塊,所以他們三個變數在記憶體中的結構就是這樣 的,因為有記憶體分塊對齊,所以最後出來的結果是8,而不是6,因為後面兩個格仔其實也算是被用了。

x2 中第乙個型別是

char

型別,它占用乙個位元組,所以它首先排在第一組塊的第乙個格仔裡面,第二個是

int型別,它占用

4個位元組,第一組塊已經用掉一格,還 剩3格,肯定是無法放下第二int型別的,因為要考慮到對齊,所以不得不把它放到第二個組塊,第三個型別是char型別,跟第乙個類似。所因為有記憶體分塊 對齊,我們的記憶體就不是8個格仔了,而是12個了。 關於

x3的說明其實跟

x1是類似的,只不過它把兩個

1個位元組的放到了前面,相信看了前面兩種情況的說明這裡也是很容易理解的。

C 記憶體對齊

vc6.0編譯器對記憶體對齊的管理方式遵循以下兩個原則 1.對於結構體內部變數的對齊方式 變數存放的起始位址相對於結構的起始位址的偏移量 char 偏移量必須為sizeof char 即1的倍數 int 偏移量必須為sizeof int 即4的倍數 float 偏移量必須為sizeof float ...

c 記憶體對齊

一.計算struct的size有兩個原則 pragma pack n n是編譯器的對齊位元組數 1 struct中各成員按照對齊原則 在為當前變數 設為a 分配記憶體時,要參考之前所有變數的偏移量之和 設為d d必須是min n,sizeof a 的倍數,否則編譯器會自動在最後補上缺少的位元組數。2...

C 記憶體對齊

一 為什麼會有記憶體對齊?字,雙字,和四字在自然邊界上不需要在記憶體中對齊。對字,雙字,和四字來說,自然邊界分別是偶數字址,可以被4整除的位址,和可以被8整除的位址。無論如何,為了提高程式的效能,資料結構 尤其是棧 應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶...