C語言結構體占用空間記憶體大小解析

2021-08-04 16:02:17 字數 1456 閱讀 4995

結構體的資料型別的有點我們就不囉嗦了,直接來看相同資料結構體的幾種書寫的格式吧。

格式一:

[cpp]view plain

copy

01.struct

tagphone    

02.phone;  

[cpp]view plain

copy

格式二:  

[cpp]view plain

copy

01.struct

tagphone    

02.phone2;   

[html]view plain

copy

格式三:  

[cpp]view plain

copy

01.struct

tagphone3    

02.phone3;   

我們都知道,char型別占用1個位元組,int型占用4個位元組,short型別占用2個位元組,long占用8個,double占用16個;

那麼我們可能會犯乙個錯誤就是直接1+4+2=7,該結構體占用7個位元組。這是錯的。

以下我們簡單分析下:

計算結構體大小時需要考慮其記憶體布局,結構體在記憶體中存放是按單元存放的,每個單元多大取決於結構體中最大基本型別的大小。

對格式一:

以int型占用4個來作為倍數,因為a占用乙個位元組後,b放不下,所以開闢新的單元,然後開闢新的單元放c,所以格式一占用的位元組數為:3*4=12;

同理對於格式二,

a後面還有三個位元組,足夠c存放,所以c根著a後面存放,然後開闢新單元存放b資料。所以格式二占用的記憶體位元組為2*4=8.

對於格式三:

上面結構計算大小,sizeof(phone3) = 1 + 2 + 4 = 7, 其大小為結構體中個字段大小之和,這也是最節省空間的一種寫法。

總結:第一種寫法,空間浪費嚴重,sizeof 計算大小與預期不一致,但是保持了每個欄位的資料型別。這也是最常見的漫不經心的寫法,一般人很容易這樣寫;

第三種寫法,最節省空間的寫法,也是使用 sizeof 求大小與預期一樣的寫法,但是全部使用位元組型別,丟失了字段本生的資料型別,不方便使用;

第二種寫法,介於第一種和第三種寫法之間,其空間上比較緊湊,同時又保持了結構體中字段的資料型別。

只要了解是這些寫法的差異性,可以視情況選用。

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

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

C 語言結構體及位域記憶體大小

c 語言結構體及位域記憶體大小 小白一枚,最近線學習野火stm32,寫個部落格記錄下自己學習之路。以下資料來自野火論壇以及其他 存對齊的規則很簡單 1.起始位址為該變數型別所佔記憶體的整數倍,若不足則不足部分用資料填充至所佔記憶體的整數倍。2.該結構體所佔總記憶體為結構體成員變數中最大資料型別的整數...

乙個結構體占用記憶體大小的問題

先來看下面的示例 struct demo int main 毫無疑問,都會說,結果為 8 這時我提出乙個問題?請問在32位和64位pc機上分別是多少,或許有些人就有些迷茫了。實際上都等於 8,這時候可能有些人更加疑惑了 實際上 int 型資料在32位 64位都只占用4位元組 下面我們再看乙個例子 s...