C 中的記憶體對齊

2021-04-16 09:23:41 字數 1164 閱讀 9789

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

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

程式一

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 中的記憶體對齊

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