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整除的位址。無論如何,為了提高程式的效能,資料結構 尤其是棧 應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶...