記憶體對齊(計算結構體大小)方法

2021-06-20 14:21:49 字數 1086 閱讀 5434

struct stu1

結構體大小等於最後乙個成員的偏移量加上最後乙個成員的大小。

第乙個成員i的偏移量為0。第二個成員c的偏移量是第乙個成員的偏移量加上第乙個成員的大小(0+4),其值為4;第三個成員j的偏移量是第二個成員的偏移量加上第二個成員的大小(4+1),其值為5。

由於儲存變數時位址對齊的要求,編譯器在編譯程式時會遵循兩條原則

一、結構體變數中成員的偏移量必須是成員大小的整數倍(0被認為是任何數的整數倍) 

二、結構體大小必須是所有成員大小的整數倍。

對照第一條,上面的例子中前兩個成員的偏移量都滿足要求,但第三個成員的偏移量為5,並不是自身(int)大小的整數倍。編譯器在處理時會在第二個成員後面補上3個空位元組,使得第三個成員的偏移量變成8。

對照第二條,結構體大小等於最後乙個成員的偏移量加上其大小,上面的例子中計算出來的大小為12,滿足要求。

struct stu2

成員k的偏移量為0;成員t的偏移量為4,都不需要調整。但計算出來的大小為6,顯然不是成員k大小的整數倍。因此,編譯器會在成員t後面補上2個位元組,使得結構體的大小變成8從而滿足第二個要求。 由此可見,大家在定義結構體型別時需要考慮到位元組對齊的情況,不同的順序會影響到結構體的大小。對比下面兩種定義順序

struct stu3

struct stu4

雖然結構體stu3和stu4中成員都一樣,但sizeof(struct stu3)的值為12而sizeof(struct stu4)的值為8。-----》所以,在定義結構體時,一般從小到大定義變數。

如果結構體中的成員又是另外一種結構體型別時應該怎麼計算呢?只需把其展開即可。但有一點需要注意,展開後的結構體的第乙個成員的偏移量應當是被展開的結構體中最大的成員的整數倍。看下面的例子:

struct stu5

ss;

int k;

}

結構體stu5的成員ss.c的偏移量應該是4,而不是2。整個結構體大小應該是16。

結構體大小方式計算

我們實際生活中,儲存的資料一般不會是同一種型別,所以引入了結構體。而結構體的大小也不是成員型別大小的簡單相加。需要考慮到系統在儲存結構體變數時的位址對齊問題。對齊方式很浪費空間,可按照計算機的訪問規則,這種對齊方式提公升了效率。結構體成員的偏移量必須是成員大小的整數倍 0被認為是任何數的整數倍 結構...

c語言計算結構體大小方法

一 記住以下四條規則 第乙個成員在與結構體變數偏移量為0的位址處。其他成員變數要對齊到某個數字 對齊數 的整數倍的位址處。對齊數 編譯器預設的乙個對齊數與該成員大小的較小值,在vs環境下預設值為8,在linux環境下預設值為4。結構體的總大小為最大對齊數 每個成員變數都有乙個對齊數 的整數倍。如果巢...

記憶體對齊之結構體大小的計算

結構體變數的位址受到記憶體對齊規則的影響,使得結構體成員並不是在記憶體中 緊挨 著的。可以參照如下結構體 10執行結果如下 最終,我用excel 的形式,做出如下的結構體成員的記憶體分配位置,如下圖黃色為實際存在資料的記憶體單元,白色空格為適應記憶體對齊而進行的偏移量。需要注意系統預設是4位元組對齊...