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

2021-08-28 07:14:10 字數 904 閱讀 2982

這個問題很經典,很容易出現,也叫記憶體的4k對齊吧

cpu傳輸資料的方式:

cpu每次傳輸資料大小由它的總線條數決定,32位傳輸4個位元組,64位傳輸8個位元組。

這裡以64位系統舉例,若宣告乙個變數大小為8位元組,起始位址位1,而cpu讀取的位址為0~7,

則該變數需要讀取兩次,顯然降低了cpu的效能。           

為提高cpu讀取的效能,採用補齊的方法提高cpu的效率。即記憶體為8位元組的資料,一定會被一次讀取,這當然需要調整變數在記憶體中的起始位址,使其從0開始。若乙個變數不滿足8位元組,則進行補齊,保證其後乙個變數的位址滿足cpu讀取的初始位址。

結構體的補全規則如下:

結構體a:

第乙個變數是char型別,大小為1位元組,第二個變數是double,是8個位元組。

以大位元組為單位進行補齊,將char補齊為8個位元組。

第三個變數是int,為4個位元組,按照8位元組單位進行補齊為8位元組。

共占用32位元組。

結構體b:

第乙個變數是double,佔8位元組

第二個變數為char,佔乙個位元組,對char進行補齊,為8個位元組,char只占用乙個位元組,後面為補位。

而剩下的位元組可以放下int,因此不用再對int進行分配位元組,共佔據兩個位元組。

結構體c:

第乙個變數是int,佔4個位元組。

第二個為char,佔乙個位元組,要對char進行補齊,補齊為4個位元組(按照結構體中記憶體最大的型別為單位進行補齊)。

第三個為double,佔8個位元組,按八個位元組進行補齊操作。

總共需要16個位元組

注意:以結構體中占用位元組最大的型別作為補齊標準。

圖引用自:

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

結構體的資料型別的有點我們就不囉嗦了,直接來看相同資料結構體的幾種書寫的格式吧。格式一 cpp view plain copy 01.struct tagphone 02.phone cpp view plain copy 格式二 cpp view plain copy 01.struct tagp...

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

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

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

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