C語言 結構體位元組對齊問題
阿新 • • 發佈:2018-11-18
方法一:
結構體在記憶體中分配一塊連續的記憶體,但結構體內的變數並不一定是連續存放的,這涉及到記憶體對齊。
原則1 資料成員對齊規則:結構(struct或聯合union)的資料成員,第一個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍地址開始儲存)。
原則2 結構體作為成員:如果一個結構裡有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍地址開始儲存。(struct a裡存有struct b,b裡有char,int,double等元素,那b應該從8的整數倍開始儲存。)
原則3
方法二:
struct的記憶體大小為每個資料記憶體的加和,首先按照最大的資料型別進行單個分配,如果前一個數據佔用不了所有的記憶體,而剩下的記憶體可以放下下一個資料,則第二個資料不另外分配記憶體(但是地址必須是從這個資料型別大小的整數倍開始,看下面的struct C),否則重新分配一個最大型別的記憶體。
例題
連結:https://www.nowcoder.com/questionTerminal/8e8b73ee8f3a402ba47876f8e0b2b62d
來源:牛客網
在64位系統下,地址佔64位 ,即指標佔64位,8個位元組。 所以,*p所佔的記憶體是這要的: a【0-7】:本身佔1個位元組,因原則1,d起始位置需要是8的倍數,於是位元組對齊佔7個位元組,共8個位元組 d【8-15】:64位指標,佔8位元組 b【16-19】:佔32位,4個位元組 c:16 【20-23】:佔16位,2個位元組,因原則1,e起始位置需要是8的倍數,於是位元組對齊佔2個位元組,共4個位元組 e【24-32】:64位,8個位元組
8 + 8 + 4 + 4 + 8 = 32