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

2022-09-25 05:06:11 字數 1805 閱讀 3613

前言

前幾天有個小朋友問了我一下,關於c語言結構體占用空間的問題。覺得以後會對小可愛有點幫助,就打算先寫一下。

struct test

test;

理論上,結構體中的各個成員在記憶體中應該是連續儲存的,就像陣列裡面的元素一樣oqhtldsgkv。事實上,也確實是這個樣子的,不過和我們想象的有點不一樣。

按照我們最初的想法,變數test所佔的記憶體為 4 + 1 + 4 = 9。

但是我們寫乙個小**驗證一下發現和我們想的不一樣。

它的記憶體為12。因為 int型別是4個位元組,所以是不是各個成員的記憶體都是按照最大的那個設定呢?畢竟 4 * 3 = 12,我們再次實驗,

如果按照我們的推測,那麼記憶體大小應該是 8 * 3 = 24。為何是16呢?

下面我來總結一下。

總結c語言結構體所佔記憶體大小,其實裡面涉及到c語言記憶體對齊,提高定址效率的一種思想在裡面。具體我就不在這裡展開來說了,有興趣的可以自己百度了解一下。

其實小可愛最想了解的應該是如何計算,結構體的記憶體大小。

不包含,陣列和指標的結構體

對於不包含,陣列和指標的結構體,知道各個成員所佔記憶體大小後,可以直接相加,不過相加的時候必須保證前面的成員變數的記憶體所佔記憶體必須是下乙個成員變數所佔記憶體的整倍數,如果不夠就補上;並且最後的結果必須要是所佔記憶體空間最大的成員變數的整倍數。

下面我來幾個例子說明:

struct test

test;

所佔記憶體大小,8 + 4 + 1 = 13,最大記憶體為8, 所以應該這樣計算 8 + 4 + 4 = 16。

下面我們交換下,

struct test

test;

所佔記憶體大小, 4 + 8 + 1 = 13,因為double型別是8個位元組,而前面只有4個位元組,並且成員變數最大記憶體為8,所以應該這樣計算 8 + 8 + 8 = 24。

struct test

test;

同理4 + 1 + 8 = 13,應該變為 4 + 4 + 8 = 16。

包含,www.cppcns.com陣列和指標的結構體包含指標的結構體

對於包含指標的結構體,可以用和上面相同的方法進行計算,一般指標的大小都是固定的4個位元組(在我的電腦上,你們可能不同),因為不管什麼型別的指標只需要儲存位址,不需要儲存位址指向空間的內容。

struct test

test;

struct test

test;

struct test

test;

這三種所佔記憶體大小均為 4 + 4 + 8 = 16。如果將變數 b 和變數 c 的位置互換,則變為 8 + 8 + 8 = 24。 包含陣列的結構體

陣列中的元素位址是連續的,所以乙個陣列所佔空間大小,為陣列型別 * 元素個數。

知道了陣列所佔空間大小後,再來說說如何計算結構體中包含陣列的情況,在之前計算的時候,我說過相加的時候必須保證前面的成員變數的記憶體所佔記憶體必須是下乙個成員變數所佔記憶體的整倍數,但是如果下一變數為陣列,則沒有這個要求。

例如:struct test

test;

應該為 4 + 24 + 4 + 8 = 40。

struct test

test;

應該為 4 + 20 + 8 + 8 = 40。

struct test

test;

應該為 1 + 19 + 4 + 8 = 32。

struct test

test;

應該為 1 + 19 + 4 + 8 = 32。

struct test

test;

應該為 1 + 15 + 8 + 8 = 32。

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語言中結構體占用記憶體大小

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