結構體變數的位址受到記憶體對齊規則的影響,使得結構體成員並不是在記憶體中「緊挨」著的。
可以參照如下結構體:
10執行結果如下:
最終,我用excel**的形式,做出如下的結構體成員的記憶體分配位置,如下圖黃色為實際存在資料的記憶體單元,白色空格為適應記憶體對齊而進行的偏移量。需要注意系統預設是4位元組對齊的,所以一行的最大寬度也就是四個位元組。
所以結構體內存分配的規則個人總結如下:
1.首成員起始位址設為0。
2.每個成員x的起始位址必須是min(4,sizeof(x))的倍數。
關於總結的第2點可以在《深入理解linux核心》記憶體管理章節中的「對齊記憶體中的物件」小節中找到依據:
slab分配器所管理的物件可以在記憶體中進行對齊,也就是說,存放它們的記憶體單元的起始實體地址是乙個給定常量的倍數,通常是2的倍數。這個常量就叫對齊因子(alignment factor)。
由於系統預設4位元組對齊,所以我認為文章所提到的對齊因子最大值也就是4了。即min(4,sizeof(x))。
這個規則我使用了多種情況驗證,都是正確的。如有錯誤,還請各位大俠批評指正哈!
在vc上可以通過如下巨集來改變記憶體對齊的位元組範圍,即改為8位元組記憶體對齊
#pragma pack (8)同樣可以用《深入理解linux核心》記憶體管理章節中的「對齊記憶體中的物件」小節中來解釋記憶體對齊的意義:
通常情況下,如果記憶體單元的實體地址是字大小(即計算機的內部記憶體匯流排的寬度)對齊的,那麼,微機對記憶體單元的訪問會非常快
。
結構體內存對齊 計算結構體的大小
在求結構體的大小時,絕大部分情況下不會直接等於各個成員大小的總和,編譯器為了優化對結構體成員的訪問總會在結構體中插入一些空白位元組 記憶體對齊 例如 struct s1 printf d n sizeof s1 struct s3 printf d n sizeof s3 結構體s1和s3的大小並不...
結構體的大小 記憶體對齊
includeusing namespace std struct t1 結果為8的倍數,因為最大成員型別double佔8位元組 16 struct t2 結果為2的倍數,因為最大成員型別short佔2位元組 4 struct t3 結果為8的倍數,因為最大成員型別double佔8位元組 16 st...
記憶體對齊(計算結構體大小)方法
struct stu1 結構體大小等於最後乙個成員的偏移量加上最後乙個成員的大小。第乙個成員i的偏移量為0。第二個成員c的偏移量是第乙個成員的偏移量加上第乙個成員的大小 0 4 其值為4 第三個成員j的偏移量是第二個成員的偏移量加上第二個成員的大小 4 1 其值為5。由於儲存變數時位址對齊的要求,編...