結構體對齊

2021-10-25 12:48:51 字數 747 閱讀 8125

1 – 結構體資料成員對齊的意義

許多實際的計算機系統對基本型別資料在記憶體中存放的位置有限制,它們會要求這些資料的起始位址的值是某個數k的倍數,這就是所謂的記憶體對齊,而這個k則被稱為該資料型別的對齊模數(alignment modulus)。這種強制的要求一來簡化了處理器與記憶體之間傳輸系統的設計,二來可以提公升讀取資料的速度。

比如這麼一種處理器,它每次讀寫記憶體的時候都從某個8倍數的位址開始,一次讀出或寫入8個位元組的資料,假如軟體能保證double型別的資料都從8倍數字址開始,那麼讀或寫乙個double型別資料就只需要一次記憶體操作。否則,我們就可能需要兩次記憶體操作才能完成這個動作,因為資料或許恰好橫跨在兩個符合對齊要求的8位元組記憶體塊上。

2 – 結構體對齊包括兩個方面的含義

1)結構體總長度;

2)結構體內各資料成員的記憶體對齊,即該資料成員相對結構體的起始位置;

3 – 結構體大小的計算方法和步驟

1)將結構體內所有資料成員的長度值相加,記為sum_a;

2)將各資料成員為了記憶體對齊,按各自對齊模數而填充的位元組數累加到和sum_a上,記為sum_b。對齊模數是#pragma pack指定的數值以及該資料成員自身長度中數值較小者。該資料相對起始位置應該是對齊模式的整數倍;

3)將和sum_b向結構體模數對齊,該模數是【#pragma pack指定的數值】、【未指定#pragma pack時,系統預設的對齊模數(32位系統為4位元組,64位為8位元組)】和【結構體內部最大的基本資料型別成員】長度中數值較小者。結構體的長度應該是該模數的整數倍。

結構體對齊

現在去掉第乙個成員變數為如下 pragma pack 4 class testc int nsize sizeof testc 按照正常的填充方式nsize的結果應該是8,為什麼結果顯示nsize為6呢?事實上,很多人對 pragma pack的理解是錯誤的。pragma pack規定的對齊長度,實...

結構體對齊

結構體對齊問題 以下結論均在gnu gcc上驗證 概念 偏移量 成員位址相對結構體位址的偏移 對齊原則 1.結構體中某成員的偏移量必須是該成員型別大小的整數倍 b 的偏移量必須是 short 大小的整數倍,故在 a 後面填充乙個位元組 c 的 型別大小是double,在ansi c中,c 的偏移量是...

結構體對齊

結構體對齊方式 1.pragma pack x 32系統預設值4,結構體元素最大長度,取三者最小值,作為每個元素對齊計算的值的倍數,並且總和是最小值的倍數!假的 於2015 12 26 修改 1.資料成員對齊原則 結構或聯合的資料成員,第乙個資料成員放在offset為0的地方,以後每個成員按照 pr...