亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

克什克腾旗| 南溪县| 育儿| 永顺县| 麻栗坡县| 林芝县| 泰州市| 洛浦县| 方城县| 阿拉善右旗| 吉木乃县| 丹江口市| 手机| 岳阳市| 永宁县| 山东省| 洪雅县| 石河子市| 化德县| 嘉定区| 麻城市| 五指山市| 霸州市| 石家庄市| 明光市| 勃利县| 河西区| 吴堡县| 隆昌县| 进贤县| 永泰县| 浑源县| 阜新| 鹿邑县| 鄂伦春自治旗| 瑞金市| 商洛市| 新余市| 广南县| 栾城县| 东山县|