C 中的記憶體對齊

2021-05-21 23:58:04 字數 1465 閱讀 6446

記憶體對齊

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

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

程式一

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...