嵌套的結構體,字節又是如何對齊的呢
先來看下面的代碼
typedef structstu1
{
char ary[5];
int a;
}stu1;
typedef structstu2
{
double a;
char b;
}stu2;
typedef structstu3
{
stu1 s;
char str;
}stu3;
typedef structstu4
{
stu2 s;
char str;
}stu4;
LOG_INFO("rnrn====== Struct Test ======rnrn");
LOG_INFO("sizeof(stu1) :t%dn",sizeof(stu1));
LOG_INFO("sizeof(stu2) :t%dn",sizeof(stu2));
LOG_INFO("sizeof(stu3) :t%dn",sizeof(stu3));
LOG_INFO("sizeof(stu4) :t%dn",sizeof(stu4));
在上面的運行結果中,stu1和stu2所占內存的分別為12字節和16字節,對這兩者的分析與前面相同。
我們重點看一下這里的stu3和stu4。
在默認情況下,結構體采用該結構體中占用內存最大的類型所占的字節數作為字節對齊方式,但是在stu3中定義的stu1結構體類型的變量s占用16字節,而stu3并不是按照16字節進行對齊的,而是采用4字節對齊,這是因為stu1和stu3中占用內存最大的是int型變量,占用4字節。因此在分析結構體字節對齊方式時需要將結構體分解為“原子類型”,如int、double、char、float、short等,而不是自定義的結構體類型。
找出分解出來的“原子類型”中占用內存最大的類型,將其占用的內存值作為結構體的默認字節對齊值。
在stu4中定義了stu2類型的結構體變量s,按照上面的方法先對stu2進行分解。分解出來的類型有double、char,stu4中還有char類型,其中占用內存最大的是double類型,占用內存大小為8字節,由此可知,stu4采用8字節對齊。
由于stu4中的stu2結構體類型變量s所占用的內存大小為16,而接下來定義了一個char類型的str變量,其偏移地址為16,占用一個字節,此時stu4占用的內存大小為17,不是字節對齊數8的整數倍,所以在stu4占用的內存的最后添加7字節的空間,使其占有內存大小為24。
需要注意,編譯器添加的內存并沒有使用,沒有存放任何有意義的內容。
在結構體的嵌套中,不管遇到多少層的嵌套,都可以按照這種分解方法,對結構體進行逐層分解,再根據分解出來的“原子類型”分析結構體的字節對齊方式.
看下面的例子,會更清楚一些
typedef structstu2
{
char a;
short c;
int d;
int b;
}stu2;
typedef structstu4
{
stu2 s;
char str;
double h;
}stu4;
LOG_INFO("offset_of(stu4,s):t%dn",offset_of(stu4,s));
LOG_INFO("offset_of(stu4,str):t%dn",offset_of(stu4,str));
LOG_INFO("offset_of(stu4,h):t%dn",offset_of(stu4,h));
在 stu2 中,a 的偏移地址為 0,c 的偏移地址為 2,d 的偏移地址為 4,b 的偏移地址為 8。這里的變量 a,c,d 組成第一個對齊單元,變量 b 會和 stu4 中的 str 組合成一個對齊單元。
套在 stu4 中以后,str 的起始地址就為 12,這里,stu2 的 b 和 stu4 的 str 共同組成了第二個 8 字節的對齊單元。
最后一個對齊單元是 double 類型的 h 變量。
-
字節
+關注
關注
0文章
40瀏覽量
13718 -
代碼
+關注
關注
30文章
4753瀏覽量
68369 -
編譯器
+關注
關注
1文章
1618瀏覽量
49057 -
結構體
+關注
關注
1文章
130瀏覽量
10835
發布評論請先 登錄
相關推薦
評論