結構體內存

2021-10-18 05:11:26 字數 1138 閱讀 3065

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

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

struct str1

;

str1這個結構體占用的記憶體是多少呢?如果用變數型別直接想加,得到的結果是17,但顯然不是這樣的。這個程式執行的正確結果是24.為什麼呢?

因為為了cpu能夠快速訪問,提高訪問效率,變數的起始位址應該具有某些特性,這就是所謂的「對齊」。比如4位元組的int型變數,那它的起始位址就應該在4位元組的邊界上,即起始位址可以被4整除。

記憶體對齊的規則很簡單:

1.起始位址為該變數型別所佔記憶體的整數倍,若不足則不足部分用資料填充至所佔記憶體的整數倍。

2.該結構體所佔總記憶體為結構體成員變數中最大資料型別的整數倍。

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

char型變數佔乙個位元組,所以它的起始位址為0,而int型別佔4個位元組,它的起始位址應該是4(的整數倍),那麼記憶體位址1、2、3就需要被填充。同樣,float占用4個位元組,而結構體中a,b兩個成員變數佔了07記憶體位址,c的位址從8開始,符合規則一,占用記憶體位址為811。double型別佔8個位元組,所以d的起始位址就應該從16開始,那麼12、13、14、15記憶體位址就需要被填充。d從16位址開始,占用8個位元組。整個結構體占用位元組數為24,符合規則二。記憶體分配如圖:紅色區域為填充部分

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

struct str2

;

str2這個結構體占用的記憶體空間是多少呢?是24!怎麼分析呢?

首先double型別的a占用記憶體位址為07,int型別的b起始位址為8,符合規則一,占用位址為811,char型別的c佔乙個位元組,位址為12.那麼double型別的d,起始位址為13嗎?顯然不是,滿足規則一的位址是16,所以d起始位址為16,占用16~23。結構體總共24個位元組,滿足規則二。如果這個結構體最後再加乙個成員變數 char e,那這個結構體占用的記憶體是多少?char型別的e起始位址為24,占用位址為24,但是結構體一種有25個位元組,就不滿足規則二了,怎麼辦呢?為了滿足規則二,我們將25~31進行填充,因此整個結構體占用32個位元組。

結構體內存對齊

結構體內存對齊 一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這...

結構體內存對齊

一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...

結構體內存對齊

對齊規則 每個特定平台上的編譯器都有自己的預設 對齊係數 也叫對齊模數 程式設計師可以通過預編譯命令 pragma pack n n 1,2,4,8,16來改變這一係數,其中的n就是你要指定的 對齊係數 規則 1 資料成員對齊規則 結構 struct 的資料成員,第乙個資料成員放在offset為0的...