對於這個問題,主要有兩方面的內容。其一,內存優化,其二,存儲順序
一、內存優化
所謂的內存優化是結構體成員的存儲按成員中數據寬度最寬的成員對齊的一種內存對齊方式。這樣做的最大好處就是可以提高處理速度(感興趣的可以查一下資料),但會增大存儲空間,這種優化是對時間和空間的一種權衡。
如果結構體中數據成員的最大寬度爲32位的,即4字節,那麼該結構體的大小將是4字節的倍數,而不是將所有成員寬度加起來的大小。同樣,如果數據成員中最大寬度爲64位的,那麼改及餓哦固體大小將是8字節的倍數。
猜想一下,下里兩個結構的大小是多少?可以輸出一下sizeof的結果
//例 1 struct str1 { int a; //佔用4字節,有效內容4字節 char b; //佔用4字節,有效內容1字節 }; struct str2 { double a; char b; //佔用8字節,有效內容1字節 }; //初始化代碼 str1 str_1 = { 1024,'A' }; str2 str_2 = { 10.5,'A' };
答案是:str1的大小爲8,str2的大小爲16。下圖是我截取的內存圖:
第一行爲
str_2.a
的內存
第二行爲str_2.b
的內存,cc
均爲棧區的填充內容
第四行前4字節爲str_1.a
的內存
第四行後4字節爲str_1.b
的內存那這樣的話豈不是結構體大小爲數據成員中最大數據寬度*數據成員個數了?也不是
這個結構體是多大?是24字節嗎?
//例 2 struct str3 { double a; int b; char c; }; //初始化代碼 str3 str_3 = { 10.5,1024,'A' };
- 答案是16字節,可以和上面的例子對比一下。
第一行8字節爲
str_3.a
的內存
第二行前4字節爲str_3.b
的內存
第二行後4字節爲str_3.c
的內存總結一下
可以把這種對齊方式比作使用特定大小的瓶子(箱子)裝東西。如果將64位數據作爲最大瓶子,那麼裝東西時所佔的空間是以瓶子爲單位的,你在大瓶子中裝了一個小東西,那麼它所佔的空間還是大瓶子的空間(第一個例子的解釋)。同時,大瓶子中還可以裝小瓶子,小瓶子中還可以裝更小的瓶子(第二個裏的解釋)編譯器默認有內存優化,在編程是也可以手動修改對齊粒度
#pragma pack(1) // 按照1字節方式進行對齊,括號中可以指定任意數
#pragma pack() // 取消指定的對齊方式
二、存儲順序
- 跟數組存儲順序一樣,越往前的數據越在低地址處。