C語言結構體內存對齊詳解
1、結構體內存對齊是指當我們創(chuàng)建一個結構體變量時,會向內存申請所需的空間,用來存儲結構體成員的內容。我們可以將其理解為結構體成員會按照特定的規(guī)則來存儲數據內容。
2、結構體的對齊規(guī)則
(1)第一個成員在相比于結構體變量存儲起始位置偏移量為0的地址處。
(2)從第二個成員開始,在其自身對齊數的整數倍開始存儲(對齊數=編譯器默認對齊數和成員字節(jié)大小的最小值,VS編譯器默認對齊數為8)。
(3)結構體變量所用總空間大小是成員中最大對齊數的整數倍。
(4)當遇到嵌套結構體的情況,嵌套結構體對齊到其自身成員最大對齊數的整數倍,結構體的大小為當下成員最大對齊數的整數倍。
3、了解了結構體的對齊規(guī)則后,我們通過實戰(zhàn)來鞏固(實例一至實例三同類,請細品實例四)
實例一:
分析:存儲結構圖如下
紅色填充內存為結構體成員a,因其為char類型且是第一個成員,由規(guī)則(1)可得如下;橙色填充為結構體成員b,因其為int類型且不是第一個成員,由規(guī)則(2)可得如下;綠色填充為結構體成員c,因其為char類型且不是第一個成員,由規(guī)則(2)(3)可得如下;畫紅叉內存位置屬于因對齊造成的浪費內存。
實例二:
分析:存儲結構如下
紅色填充內存為結構體成員a,因其為char類型且是第一個成員,由規(guī)則(1)可得如下;橙色填充為結構體成員b,因其為char類型且不是第一個成員,由規(guī)則(2)可得如下;綠色填充為結構體成員c,因其為int類型且不是第一個成員,由規(guī)則(2)(3)可得如下;畫紅叉內存位置屬于因對齊造成的浪費內存。
實例三:
分析:存儲結構如下
紅色填充內存為結構體成員a,因其為double類型且是第一個成員,由規(guī)則(1)可得如下;橙色填充為結構體成員b,因其為char類型且不是第一個成員,由規(guī)則(2)可得如下;綠色填充為結構體成員c,因其為int類型且不是第一個成員,由規(guī)則(2)(3)可得如下;畫紅叉內存位置屬于因對齊造成的浪費內存。
實例四:
分析:存儲結構圖如下
紅色填充內存為結構體成員a,因其為double類型且是第一個成員,由規(guī)則(1)可得如下;橙色填充為結構體成員s3,因其為嵌套結構體且不是第一個成員,大小為16,由規(guī)則(4)可得如下圖;綠色填充為結構體成員c,因其為int類型且不是第一個成員,由規(guī)則(2)(3)可得如下;畫紅叉內存位置屬于因對齊造成的浪費內存。
總結
到此這篇關于C語言結構體內存對齊詳解的文章就介紹到這了,更多相關C語言結構體內存內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++ float轉std::string 小數位數控制問題
這篇文章主要介紹了C++ float轉std::string 小數位數控制問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11