C語言計算結構體佔用位元組大小總數
在學習C語言的時候很多人可能遇到了和我同樣的問題,就是無法正確計算出C語言結構體所佔位元組的總的大小。首先,在開始計算結構體佔用位元組大小之前,我們要先搞懂什麼是結構體的對齊和補齊。為什麼會有結構體的對齊與補齊。
CPU的資料傳輸方式:
CPU的資料傳輸方式是一次傳輸2個(32位)或者8個(64位)位元組的方式進行傳輸(根據匯流排條數來確定),這裡我們以64位系統來舉例,如果你宣告一個變數佔用8個位元組,且該變數的其實地址是1,由於CPU一次讀取8個位元組,讀取位元組的地址是從0到8,那麼cpu要得到該變數的值,需要讀取兩次,降低了cpu的效能。為了提高cpu讀取的效能和效率,採取了補齊的方法來優化cpu的執行效率。也就是說,你宣告的8個位元組的變數,一定會被cpu一次性讀取,即改變數的初始地址,一定是從0開始,如果上一個變數不滿足8位元組,會自動被補齊來保證下一個位元組的其實地址為cpu讀取的初始地址。
補齊和對齊:
為了保證cpu每次在讀取一個變數的時候都是從初始地址開始的,所以,將不滿足8位元組大小的變數進行補全。
那麼結構體是如何補全的呢?如下圖:
結構體A記憶體分配:
對char a 分配一個位元組,但是由於要與double補齊,所以,需要給char a 新增7個補位,保證與double補齊。當系統給int分配記憶體的時候,需要給double補齊,所以,也分配了8個位元組,但是int實際佔用4個位元組,剩餘的都是補位。
結構體B記憶體分配:
double b分配8個位元組,為了補齊int也分配8個位元組,由於int實際佔用4個位元組,剩餘都是補位,且剩餘的位元組數可以裝下char型別位元組,所以,char就不需要額為分配記憶體即可。即總共16個位元組。C和D也是一樣。
從上面的例子可以發現,在分配記憶體的時候除了變數型別以為,還有就是宣告的順序也可能影響記憶體的分配方式,所以,在進行程式設計的時候,尤其是需要對記憶體進行優化的時候,一定要注意,除了型別,宣告順序也同樣重要,因為系統會根據宣告的先後順序進行記憶體分配.
特別注意:
在計算結構體所佔位元組大小的時候一定要注意,要以結構體中佔用位元組最大的型別作為補齊標準。