這個問題很經典,很容易出現,也叫記憶體的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.該結構體所佔總記憶體為結構體成員變數中最大資料型別的整數...