記憶體對齊
在我們的程式中,資料結構還有變數等等都需要占有記憶體,在很多系統中,它都要求記憶體分配的時候要對齊,這樣做的好處就是可以提高訪問記憶體的速度。
我們還是先來看一段簡單的程式:
程式一
1#include
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,如圖所示
中第乙個型別是
char
型別,它占用乙個位元組,所以它首先排在第一組塊的第乙個格仔裡面,第二個是
int型別,它占用
4個位元組,第一組塊已經用掉一格,還剩
3格,肯定是無法放下第二
int型別的,因為要考慮到對齊,所以不得不把它放到第二個組塊,第三個型別是
char
型別,跟第乙個類似。所因為有記憶體分塊對齊,我們的記憶體就不是
8個格仔了,而是
12個了。
再看看x3
,如下圖所示:
x3的說明其實跟
x1是類似的,只不過它把兩個
1個位元組的放到了前面,相信看了前面兩種情況的說明這裡也是很容易理解的。
C 中的記憶體對齊
在我們的程式中,資料結構還有變數等等都需要占有記憶體,在很多系統中,它都要求記憶體分配的時候要對齊,這樣做的好處就是可以提高訪問記憶體的速度。我們還是先來看一段簡單的程式 程式一 1 include iostream 2using namespace std 34 structx15 1011str...
C 中的記憶體對齊
c 的一道題 include iostream include string using namespace std pragma pack 1 struct student stu struct s s void main stu 結構體對齊 最後的偏移位址25不是4的倍數,填充3個位元組後,滿足...
c 中的記憶體對齊
32bit,x86環境,vs2010 struct test 對其執行sizeof test 得到值為32,並且我們對裡面每個變數取sizeof,確實是所屬型別的大小,但為什麼不是1 4 1 8 1 15呢,我們執行下面 來計算每個變數之間的位址偏移量 test t cout sizeof t en...