C語言中結構體佔用內存大小

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

 

相關知識:

cpu傳輸數據的方式:

cpu每次傳輸數據大小由它的總線條數決定,32位傳輸4個字節,64位傳輸8個字節。

這裏以64位系統舉例,若聲明一個變量大小爲8字節,起始地址位1,而cpu讀取的地址爲0~7,

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

爲提高cpu讀取的性能,採用補齊的方法提高cpu的效率。即內存爲8字節的數據,一定會被一次讀取,這當然需要調整變量在內存中的起始地址,使其從0開始。若一個變量不滿足8字節,則進行補齊,保證其後一個變量的地址滿足cpu讀取的初始地址。

 

補齊:爲保證cpu每次讀取都是從初始地址開始,對長度不滿足8字節的變量進行補全。

結構體的補全規則如下:

結構體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個字節

 

結論:不難發現,內存的分配,不僅數據類型相關,還和變量聲明的順序相關。

 

注意:以結構體中佔用字節最大的類型作爲補齊標準。

 

 

 

圖引用自:https://blog.csdn.net/jiaozhenxinaichenme/article/details/53097007

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章