91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言結構體內存對齊問題舉例分析

發布時間:2021-11-23 09:14:24 來源:億速云 閱讀:158 作者:iii 欄目:互聯網科技

這篇文章主要講解了“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;
}

運行結果為:

C語言結構體內存對齊問題舉例分析  

可見,正好印證了上述的說法,補齊之后結構體成員a1,a2,a3的地址之間正好相差4個字節,a3與a4之間相差兩個字節也是因為在其中多留出了1個空白字節。該程序的運行結果可形象地描述為下圖:

C語言結構體內存對齊問題舉例分析  

a1只占用一個字節,為了內存對齊保留了三個空白字節;a3和a4加起來共3字節,為了內存對齊保留了1個空白字節。這就是編譯器存儲變量時做的見不得人的”手腳“,以方便其雇主——CPU能更快地找到這些變量。

感謝各位的閱讀,以上就是“C語言結構體內存對齊問題舉例分析”的內容了,經過本文的學習后,相信大家對C語言結構體內存對齊問題舉例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平南县| 武穴市| 上栗县| 密云县| 河南省| 新平| 侯马市| 新野县| 周口市| 东安县| 铁力市| 延边| 海南省| 九江县| 宝山区| 墨竹工卡县| 格尔木市| 衡南县| 囊谦县| 临海市| 库尔勒市| 永定县| 毕节市| 神池县| 全南县| 贵港市| 绥阳县| 河东区| 宁波市| 广水市| 聊城市| 桂阳县| 广元市| 浦县| 洪江市| 濮阳县| 遂平县| 陆川县| 德安县| 建昌县| 莫力|