這個問題很經典,很容易出現,也叫內存的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