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

2021-10-02 06:32:42 字數 639 閱讀 5186

先舉乙個案例:

struct data 

;

如果簡單的相加,得出來data的size大小應該是17bytes,

但用**檢查答案卻是24bytes!

std::cout <<

sizeof

(data)

<< std::endl;

比如說a是int型(4位元組),所以起始位址必然是4的倍數。

所以讓我們來計算一下:

a的起始位址為0,符合條件;

b的起始位址為4(0+4),不符合條件,所以需要往後偏移4位元組,新起始位址為8;

c的起始位址為16(8+8),符合條件;

d的起始位址為17(16+1),不符合條件,所以需要往後偏移3位元組,新起始位址為20。

總計20+4 = 24位元組。

至於為什麼要進行記憶體對齊,原因有以下兩點:

效能原因:資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。(注:這一點原因涉及計算機組成原理中的指令週期,屬於硬體方面的知識)

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

什麼是記憶體對齊?為什麼要記憶體對齊?

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

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

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

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

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

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