結構體預設的位元組對齊一般滿足三個準則:
1) 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;
2) 結構體每個成員相對於結構體首位址的偏移量(
offset
)都是成員自身大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(
internal adding
);3)
結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組(
trailing padding)。
例項**
#include
#include
typedef struct s1s1;
typedef struct s2s2;
int main()
列印結果如下:
對於s2,檢視其資料成員的起始位址發現
char型別的變數a占用1個位元組,double型別的變數b的起始位址與a的起始位址的偏移量為8,滿足對其原則(2),int型別的變數c的起始位址與b的相比,偏移量為8滿足原則(2)。對於整個結構體的大小(24)滿足原則(3);
結構體在記憶體中的對其原則
乙個結構體定義完了之後,其在記憶體中的儲存並不等於所有元素寬度之和。基本資料型別結構體遵循 原則一 結構體中的元素是按照定義的順序乙個個放到記憶體中去的,並不緊密排布。從記憶體儲存單元的首位址 0 開始,每乙個元素都認為記憶體根據它的大小來劃分,所以每乙個元素存放的位置從自己寬度的整數倍開始。原則二...
結構體在記憶體中的對其規則
乙個結構體變數定義完之後,其在記憶體中的儲存並不等於其所包含元素的寬度之和。例一 include using namespace std struct x s1 voidmain 比如例一中的結構體變數s1定義之後,經測試,會發現sizeof s1 16,其值不等於sizeof s1.a 1 siz...
結構體的對其規則以及為什麼要對其
1.第乙個成員在與結構體變數偏移量為0的位址處。2.其他成員變數要對齊到某個數字 對齊數 的整數倍的位址處。對齊數 編譯器預設的乙個對齊數 與 該成員大小的較小值。vs中預設的值為8 3.結構體總大小為最大對齊數 每個成員變數都有乙個對齊數 的整數倍。4.如果巢狀了結構體的情況,巢狀的結構體對齊到自...