C語言結構體struck所占用的位元組數如何計算

2021-09-17 00:21:28 字數 1169 閱讀 5615

格式1

01.struct tagphone

02.phone;

格式2

01.struct tagphone

02.phone2;

格式3

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語言結構體占用記憶體問題

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

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

之前對結構體占用記憶體一直很混亂,到底是按照哪個變數型別計算記憶體?還是怎麼計算?下面先看乙個例子 struct str1 str1這個結構體占用的記憶體是多少呢?如果用變數型別直接想加,得到的結果是17,但顯然不是這樣的。這個程式執行的正確結果是24.為什麼呢?因為為了cpu能夠快速訪問,提高訪問...

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

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