在我們的程式中,資料結構還有變數等等都需要占有記憶體,在很多系統中,它都要求記憶體分配的時候要對齊,這樣做的好處就是可以提高訪問記憶體的速度。
我們還是先來看一段簡單的程式:
程式一
1#include
<
iostream
>
2using
namespace
std;34
structx15
;1011struct
x212;17
18struct
x319;24
intmain()25
這段程式的功能很簡單,就是定義了三個結構x1,x2,x3,這三個結構的主要區別就是記憶體資料擺放的順序,其他都是一樣的,另外程式輸入了幾種基本型別所占用的位元組數,以及我們這裡的三個結構所占用的位元組數。
這段程式的執行結果為: 1
long42
float43
int4
4char15
x1 的大小 86
x2 的大小 127
x3 的大小 8
結果的前面四行沒有什麼問題,但是我們在最後三行就可以看到三個結構占用的空間大小不一樣,造成這個原因就是內部資料的擺放順序,怎麼會這樣呢?
下面就是我們需要講的記憶體對齊了。
記憶體是乙個連續的塊,我們可以用下面的圖來表示, 它是以4個位元組對乙個對齊單位的:
圖一讓我們看看三個結構在記憶體中的布局:
首先是 x1,如下圖所示
x1 中第乙個是 int型別,它占有4位元組,所以前面4格就是滿了,然後第二個是char型別,這中型別只佔乙個位元組,所以它占有了第二個4位元組組塊中的第一格,第三個也是char型別,所以它也占用乙個位元組,它就排在了第二個組塊的第二格,因為它們加在一起大小也不超過乙個塊,所以他們三個變數在記憶體中的結構就是這樣的,因為有記憶體分塊對齊,所以最後出來的結果是8,而不是6,因為後面兩個格仔其實也算是被用了。
再次看看x2,如圖所示
x2中第乙個型別是char型別,它占用乙個位元組,所以它首先排在第一組塊的第乙個格仔裡面,第二個是int型別,它占用4個位元組,第一組塊已經用掉一格,還剩3格,肯定是無法放下第二int型別的,因為要考慮到對齊,所以不得不把它放到第二個組塊,第三個型別是char型別,跟第乙個類似。所因為有記憶體分塊對齊,我們的記憶體就不是8個格仔了,而是12個了。
再看看x3,如下圖所示:
C 中的記憶體對齊
記憶體對齊 在我們的程式中,資料結構還有變數等等都需要占有記憶體,在很多系統中,它都要求記憶體分配的時候要對齊,這樣做的好處就是可以提高訪問記憶體的速度。我們還是先來看一段簡單的程式 程式一 1 include 2using namespace std 34 structx15 1011struct...
C中記憶體對齊問題
1 對於基本資料型別 許多計算機系統對基本資料型別可允許位址作了一定的限制,要求某種型別物件的位址必須是某個值n 通常是2 4 8 的倍數,從而來簡化處理器和儲存器之間的介面的硬體設計。如linux的對齊策略是2位元組資料型別,例如short的位址必須是2的倍數。而較大的資料型別如 int int ...
C 中的記憶體對齊
在我們的程式中,資料結構還有變數等等都需要占有記憶體,在很多系統中,它都要求記憶體分配的時候要對齊,這樣做的好處就是可以提高訪問記憶體的速度。我們還是先來看一段簡單的程式 程式一 1 include iostream 2using namespace std 34 structx15 1011str...