您好,登錄后才能下訂單哦!
這篇文章主要講解了“C語言結構體內存對齊問題舉例分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C語言結構體內存對齊問題舉例分析”吧!
先看一個結構體:
typedef struct Test
{
char a1;
int a2;
char a3;
short a4;
}Test_T;
在32位編譯系統下這一個結構體的字節數是多少呢?是1+4+1+2=8字節嗎?不是的,實際結果為12字節。為什么呢?因為編譯器會對不足4字節的變量空間自動補齊為4個字節(這就是內存對齊),以提高CPU的尋址效率(32位CPU以4個字節步長尋址的)。
內存對齊是編譯器的“管轄范圍”。編譯器為程序中的每個”數據單元“安排在適當的位置上,以便于能快速的找到每個“數據單元”。對于32bit的CPU,其尋址的步長為4個字節(即unsigned int 字節長度),這就是常說的“4字節對齊”。同理,對于64bit的CPU,就有“8字節對齊”。本文以32位的CPU為例。
請看下面代碼:
#include <stdio.h>
typedef struct Test
{
char a1;
int a2;
char a3;
short a4;
}Test_T;
int main(void)
{
Test_T T;
printf("\nsizeof(T) = %d\n", sizeof(T));
printf("a1地址:%d\n", (unsigned int)&T.a1);
printf("a2地址:%d\n", (unsigned int)&T.a2);
printf("a3地址:%d\n", (unsigned int)&T.a3);
printf("a4地址:%d\n", (unsigned int)&T.a4);
return 0;
}
運行結果為:
可見,正好印證了上述的說法,補齊之后結構體成員a1,a2,a3的地址之間正好相差4個字節,a3與a4之間相差兩個字節也是因為在其中多留出了1個空白字節。該程序的運行結果可形象地描述為下圖:
a1只占用一個字節,為了內存對齊保留了三個空白字節;a3和a4加起來共3字節,為了內存對齊保留了1個空白字節。這就是編譯器存儲變量時做的見不得人的”手腳“,以方便其雇主——CPU能更快地找到這些變量。
感謝各位的閱讀,以上就是“C語言結構體內存對齊問題舉例分析”的內容了,經過本文的學習后,相信大家對C語言結構體內存對齊問題舉例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。