嵌套的結(jié)構(gòu)體,字節(jié)又是如何對(duì)齊的呢
先來看下面的代碼
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));
在上面的運(yùn)行結(jié)果中,stu1和stu2所占內(nèi)存的分別為12字節(jié)和16字節(jié),對(duì)這兩者的分析與前面相同。
我們重點(diǎn)看一下這里的stu3和stu4。
在默認(rèn)情況下,結(jié)構(gòu)體采用該結(jié)構(gòu)體中占用內(nèi)存最大的類型所占的字節(jié)數(shù)作為字節(jié)對(duì)齊方式,但是在stu3中定義的stu1結(jié)構(gòu)體類型的變量s占用16字節(jié),而stu3并不是按照16字節(jié)進(jìn)行對(duì)齊的,而是采用4字節(jié)對(duì)齊,這是因?yàn)閟tu1和stu3中占用內(nèi)存最大的是int型變量,占用4字節(jié)。因此在分析結(jié)構(gòu)體字節(jié)對(duì)齊方式時(shí)需要將結(jié)構(gòu)體分解為“原子類型”,如int、double、char、float、short等,而不是自定義的結(jié)構(gòu)體類型。
找出分解出來的“原子類型”中占用內(nèi)存最大的類型,將其占用的內(nèi)存值作為結(jié)構(gòu)體的默認(rèn)字節(jié)對(duì)齊值。
在stu4中定義了stu2類型的結(jié)構(gòu)體變量s,按照上面的方法先對(duì)stu2進(jìn)行分解。分解出來的類型有double、char,stu4中還有char類型,其中占用內(nèi)存最大的是double類型,占用內(nèi)存大小為8字節(jié),由此可知,stu4采用8字節(jié)對(duì)齊。
由于stu4中的stu2結(jié)構(gòu)體類型變量s所占用的內(nèi)存大小為16,而接下來定義了一個(gè)char類型的str變量,其偏移地址為16,占用一個(gè)字節(jié),此時(shí)stu4占用的內(nèi)存大小為17,不是字節(jié)對(duì)齊數(shù)8的整數(shù)倍,所以在stu4占用的內(nèi)存的最后添加7字節(jié)的空間,使其占有內(nèi)存大小為24。
需要注意,編譯器添加的內(nèi)存并沒有使用,沒有存放任何有意義的內(nèi)容。
在結(jié)構(gòu)體的嵌套中,不管遇到多少層的嵌套,都可以按照這種分解方法,對(duì)結(jié)構(gòu)體進(jìn)行逐層分解,再根據(jù)分解出來的“原子類型”分析結(jié)構(gòu)體的字節(jié)對(duì)齊方式.
看下面的例子,會(huì)更清楚一些
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 組成第一個(gè)對(duì)齊單元,變量 b 會(huì)和 stu4 中的 str 組合成一個(gè)對(duì)齊單元。
套在 stu4 中以后,str 的起始地址就為 12,這里,stu2 的 b 和 stu4 的 str 共同組成了第二個(gè) 8 字節(jié)的對(duì)齊單元。
最后一個(gè)對(duì)齊單元是 double 類型的 h 變量。
-
字節(jié)
+關(guān)注
關(guān)注
0文章
44瀏覽量
14380 -
代碼
+關(guān)注
關(guān)注
30文章
4968瀏覽量
73999 -
編譯器
+關(guān)注
關(guān)注
1文章
1672瀏覽量
51648 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
131瀏覽量
11372
發(fā)布評(píng)論請(qǐng)先 登錄
C語言-結(jié)構(gòu)體對(duì)齊詳解
RM48HDK平臺(tái)CCS結(jié)構(gòu)體字節(jié)對(duì)齊總是咨詢
CCS3.3 結(jié)構(gòu)體成員對(duì)齊
請(qǐng)問在ccs4.2 中怎么設(shè)置結(jié)構(gòu)體的字節(jié)對(duì)齊?
請(qǐng)問z-stack結(jié)構(gòu)體默認(rèn)對(duì)齊方式是一字節(jié)嗎?
請(qǐng)問cc2640r2 ccs7.4結(jié)構(gòu)體字節(jié)能實(shí)現(xiàn)對(duì)齊嗎?
STM32終極字節(jié)對(duì)齊的相關(guān)資料推薦
解析C語言結(jié)構(gòu)體字節(jié)如何對(duì)齊
C語言中Linux字節(jié)對(duì)齊的問題
STM32 終極字節(jié)對(duì)齊解析
對(duì)結(jié)構(gòu)體的對(duì)齊理解上有點(diǎn)偏差
結(jié)構(gòu)體對(duì)齊為什么那么重要?
為什么要結(jié)構(gòu)體對(duì)齊?為什么結(jié)構(gòu)體對(duì)齊那么重要?
什么是結(jié)構(gòu)體的字節(jié)對(duì)齊現(xiàn)象
嵌套的結(jié)構(gòu)體 字節(jié)是如何對(duì)齊的
評(píng)論