什么是結(jié)構(gòu)體的字節(jié)對(duì)齊現(xiàn)象
程序員,咱都用代碼說話,先上 code:
(說明:以下代碼均在 ARM 平臺(tái)上,使用 Keil 進(jìn)行編譯測(cè)試)
//上面這個(gè)宏定義主要用于顯示結(jié)構(gòu)體成員變量相對(duì)結(jié)構(gòu)體起始地址的偏移
typedef structstu1
{
int a;
char b;
int c;
}stu1;
void main()
{
LOG_INFO("rnrn====== Struct Test ======rnrn");
LOG_INFO("offset_of(stu1,a):t%dn",offset_of(stu1,a));
LOG_INFO("offset_of(stu1,b):t%dn",offset_of(stu1,b));
LOG_INFO("offset_of(stu1,c):t%dn",offset_of(stu1,c));
LOG_INFO("sizeof(stu1) :t%dn",sizeof(stu1));
return ;
}
對(duì)于上面的運(yùn)行結(jié)果,對(duì)字節(jié)對(duì)齊不了解的同學(xué)可能會(huì)疑惑,c的偏移量怎么會(huì)是8呢?不應(yīng)該是 5 嗎?
結(jié)構(gòu)體的大小怎么會(huì)是12呢?不應(yīng)該是 9 嗎?
不了解的同學(xué)可能會(huì)這樣理解:
c的偏移量是sizeof(int)+sizeof(char) = 5
結(jié)構(gòu)體stu1占用的內(nèi)存大小應(yīng)該是sizeof(int)+sizeof(char)+sizeof(int)=9。
通過下圖所示的stu1的內(nèi)存結(jié)構(gòu)可以知道,編譯器對(duì)變量存儲(chǔ)進(jìn)行了一個(gè)特殊處理。
為了提高CPU的存儲(chǔ)速度,編譯器對(duì)一些變量的起始地址做了對(duì)齊處理。
在默認(rèn)情況下,編譯器規(guī)定各成員變量存放的起始地址相對(duì)于結(jié)構(gòu)體的起始地址的偏移量,必須為該變量的類型所占用的字節(jié)數(shù)和編譯器編譯過程中采用的字節(jié)對(duì)齊數(shù)兩者中最小值的整數(shù)倍。
有點(diǎn)繞,比如stu1 結(jié)構(gòu)體中,變量 c 類型為 int,也就是占用 4 字節(jié),編譯器采用 4 字節(jié)對(duì)齊,因此偏移量必須是 4 的整數(shù)倍。
typedef structstu2
{
int a;
char b;
char c
int d;
}stu2;
再比上面的 stu2中,如對(duì)于變量 c,其類型為 char ,占用 1 字節(jié),編譯器采用 4 字節(jié)對(duì)齊,因此 它被分配的偏移量需要是 1 的整數(shù)倍,在上面的結(jié)構(gòu)體 stu2 中,c 的偏移量為 5。
如圖:
現(xiàn)在來分析前面的代碼
假定a的起始地址為0,它占用了4字節(jié),接下來的空閑地址就是4,是1的倍數(shù),滿足要求,所以b存放的起始地址是4,占用一個(gè)字節(jié),接下來的空閑地址為5。c也是char變量,占用1字節(jié), 因此可以放在地址 5 上面。
接下來看地址 6,對(duì)于 d,它占用了 4 個(gè)字節(jié),同時(shí)需要注意的是,編譯器默認(rèn)按照結(jié)構(gòu)體中占有內(nèi)存最大的類型所占用的字節(jié)數(shù)進(jìn)行字節(jié)對(duì)齊。在此結(jié)構(gòu)體中占用內(nèi)存最大的為整型,占用4字節(jié),所以在此取兩者的最小值4,6 并不是4的整數(shù)倍,所以向后移動(dòng),找到離6最近的8作為存放d的起始地址,d也占用4字節(jié),最后結(jié)構(gòu)體的大小為12。
需要注意的就是,變量b和 c后面2字節(jié)的存儲(chǔ)空間是由編譯器自動(dòng)填充的,其中沒有存儲(chǔ)任何有用的信息。
-
ARM
+關(guān)注
關(guān)注
134文章
9121瀏覽量
368230 -
字節(jié)
+關(guān)注
關(guān)注
0文章
40瀏覽量
13775 -
代碼
+關(guān)注
關(guān)注
30文章
4808瀏覽量
68808 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
130瀏覽量
10860
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論