關於結構體的內存分配

最近又撿起了C語言,遇到了大量對結構體操作的業務,在操作期間,發現對結構體在內存中的分配仍然存有一定的疑問。,經過學習,特把有關結構體內存分配的相關知識記錄下來。

內存對齊:要了解結構體的內存分配,首先需要了解內存對齊的概念。之所以會有內存對齊的概念,是因爲,在操作系統中,數據的存放時按照字節存放的,而結構體又不像數組,結構體中可以存放不同類型的數據,它的大小也不是簡單的各個數據成員大小之和,限於讀取內存的要求,而是每個成員在內存中的存儲都要按照一定偏移量來存儲,根據類型的不同,每個成員都要按照一定的對齊數進行對齊存儲,最後整個結構體的大小也要按照一定的對齊數進行對齊。關於具體的概念以及爲什麼要採用內存對齊的方式可以參考博文:https://blog.csdn.net/Misszhoudandan/article/details/81570548

下面就結合具體的例子來描述結構體的內存空間是怎麼分配的:

1、請看下面的結構體:

struct MsgTest
{
	char a;
	int b;
};

MsgTest佔多少個字節呢?剛開始我以爲是5字節(char 1字節+int 4字節),但實際上是8字節,請看下圖:

由上圖可以看出,char類型的元素a的起始地址爲0x43fd50,而int型元素b的起始地址爲0x43fd54,也就是說,系統爲元素a總共分配了4個字節的內存(雖然a本身只佔用了一個字節長度的內存),剩下的3字節長度的內存就是基於內存對齊的概念進行填充的,不計入操作。

2、接下來看如下的結構體:

struct MsgTest
{
	char a;
	char b;
	int c;
};

按照上節講述的原則,那這個結構體所佔的內存應該是12字節,但實際上他佔了多少個字節呢?請看下圖:

這個結構體也是佔了8字節。爲什麼會這樣呢,那是因爲基於內存對齊的概念,每一個元素應該是按照4字節的標準進行補齊,但是元素a和元素b各佔1字節,所以還剩下2字節需要補齊,右上圖也可以看出,元素a和元素b的內存只相差了一個字節。實際上,在該結構體中即使是如下樣式:

struct MsgTest
{
    char a;
    char b;
    char c;
    char d;
    int e;
};

它所佔的內存仍然是8個字節:

3、下面是一些其他格式的結構體:

1):

2):

在該結構體中,a佔了4字節,b佔了40字節(16進製爲28),c佔了4字節,d佔了8字節,e佔了8字節。

3):

可以看一下如下的題目,各位可以先算一下佔多少個字節:

需要注意的是,對char*類型的元素,在內存中存放的其實是它的地址(佔4字節),_int64類型的佔8字節,unsigned其實是unsigned int的簡寫,也佔了4字節。

參看答案如下所示:

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章