C語言中結構體占用內存問題


之前對結構體占用內存一直很混亂,到底是按照哪個變量類型計算內存?還是怎么計算?下面先看一個例子:

struct str1
	{
		char a;
		int b;
		float c;
		double d;
	};

str1這個結構體占用的內存是多少呢?如果用變量類型直接想加,得到的結果是17,但顯然不是這樣的。這個程序運行的正確結果是24.為什么呢?

  因為為了CPU能夠快速訪問,提高訪問效率,變量的起始地址應該具有某些特性,這就是所謂的“對齊”。比如4字節的int型變量,那它的起始地址就應該在4字節的邊界上,即起始地址可以被4整除。

  內存對齊的規則很簡單:

  1.起始地址為該變量類型所占內存的整數倍,若不足則不足部分用數據填充至所占內存的整數倍。

  2.該結構體所占總內存為結構體成員變量中最大數據類型的整數倍。

  接下來我們分析上面的例子:

  char型變量占一個字節,所以它的起始地址為0,而int類型占4個字節,它的起始地址應該是4(的整數倍),那么內存地址1、2、3就需要被填充。同樣,float占用4個字節,而結構體中a,b兩個成員變量占了0~7內存地址,c的地址從8開始,符合規則一,占用內存地址為8~11。double類型占8個字節,所以d的起始地址就應該從16開始,那么12、13、14、15內存地址就需要被填充。d從16地址開始,占用8個字節。整個結構體占用字節數為24,符合規則二。內存分配如圖:紅色區域為填充部分

下面再舉一個例子,進一步說明:

 

struct str2
	{
		double a;
		int b;
		char c;
		double d;
	};

str2這個結構體占用的內存空間是多少呢?是24!怎么分析呢?

首先double類型的a占用內存地址為0~7,int類型的b起始地址為8,符合規則一,占用地址為8~11,char類型的c占一個字節,地址為12.那么double類型的d,起始地址為13嗎?顯然不是,滿足規則一的地址是16,所以d起始地址為16,占用16~23。結構體總共24個字節,滿足規則二。如果這個結構體最后再加一個成員變量 char e,那這個結構體占用的內存是多少?char類型的e起始地址為24,占用地址為24,但是結構體一種有25個字節,就不滿足規則二了,怎么辦呢?為了滿足規則二,我們將25~31進行填充,因此整個結構體占用32個字節。

這就是結構體內存占用問題的分析方法。由於水平有限,有什么問題希望讀者不吝賜教!

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM