C語言中結構體占用記憶體問題

2022-08-24 05:36:09 字數 1142 閱讀 4059

之前對結構體占用記憶體一直很混亂,到底是按照哪個變數型別計算記憶體?還是怎麼計算?下面先看乙個例子:

struct str1

;

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

;

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個位元組。

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

C語言結構體占用記憶體問題

先舉乙個案例 struct data 如果簡單的相加,得出來data的size大小應該是17bytes,但用 檢查答案卻是24bytes!std cout sizeof data std endl 比如說a是int型 4位元組 所以起始位址必然是4的倍數。所以讓我們來計算一下 a的起始位址為0,符合...

C語言中結構體占用記憶體大小

這個問題很經典,很容易出現,也叫記憶體的4k對齊吧 cpu傳輸資料的方式 cpu每次傳輸資料大小由它的總線條數決定,32位傳輸4個位元組,64位傳輸8個位元組。這裡以64位系統舉例,若宣告乙個變數大小為8位元組,起始位址位1,而cpu讀取的位址為0 7,則該變數需要讀取兩次,顯然降低了cpu的效能。...

C語言結構體占用記憶體深入講解

前言 前幾天有個小朋友問了我一下,關於c語言結構體占用空間的問題。覺得以後會對小可愛有點幫助,就打算先寫一下。struct test test 理論上,結構體中的各個成員在記憶體中應該是連續儲存的,就像陣列裡面的元素一樣oqhtldsgkv。事實上,也確實是這個樣子的,不過和我們想象的有點不一樣。按...