C語言結(jié)構(gòu)體內(nèi)存對齊詳解
1、結(jié)構(gòu)體內(nèi)存對齊是指當(dāng)我們創(chuàng)建一個結(jié)構(gòu)體變量時,會向內(nèi)存申請所需的空間,用來存儲結(jié)構(gòu)體成員的內(nèi)容。我們可以將其理解為結(jié)構(gòu)體成員會按照特定的規(guī)則來存儲數(shù)據(jù)內(nèi)容。
2、結(jié)構(gòu)體的對齊規(guī)則
(1)第一個成員在相比于結(jié)構(gòu)體變量存儲起始位置偏移量為0的地址處。
(2)從第二個成員開始,在其自身對齊數(shù)的整數(shù)倍開始存儲(對齊數(shù)=編譯器默認(rèn)對齊數(shù)和成員字節(jié)大小的最小值,VS編譯器默認(rèn)對齊數(shù)為8)。
(3)結(jié)構(gòu)體變量所用總空間大小是成員中最大對齊數(shù)的整數(shù)倍。
(4)當(dāng)遇到嵌套結(jié)構(gòu)體的情況,嵌套結(jié)構(gòu)體對齊到其自身成員最大對齊數(shù)的整數(shù)倍,結(jié)構(gòu)體的大小為當(dāng)下成員最大對齊數(shù)的整數(shù)倍。
3、了解了結(jié)構(gòu)體的對齊規(guī)則后,我們通過實戰(zhàn)來鞏固(實例一至實例三同類,請細(xì)品實例四)
實例一:
分析:存儲結(jié)構(gòu)圖如下
紅色填充內(nèi)存為結(jié)構(gòu)體成員a,因其為char類型且是第一個成員,由規(guī)則(1)可得如下;橙色填充為結(jié)構(gòu)體成員b,因其為int類型且不是第一個成員,由規(guī)則(2)可得如下;綠色填充為結(jié)構(gòu)體成員c,因其為char類型且不是第一個成員,由規(guī)則(2)(3)可得如下;畫紅叉內(nèi)存位置屬于因?qū)R造成的浪費內(nèi)存。
實例二:
分析:存儲結(jié)構(gòu)如下
紅色填充內(nèi)存為結(jié)構(gòu)體成員a,因其為char類型且是第一個成員,由規(guī)則(1)可得如下;橙色填充為結(jié)構(gòu)體成員b,因其為char類型且不是第一個成員,由規(guī)則(2)可得如下;綠色填充為結(jié)構(gòu)體成員c,因其為int類型且不是第一個成員,由規(guī)則(2)(3)可得如下;畫紅叉內(nèi)存位置屬于因?qū)R造成的浪費內(nèi)存。
實例三:
分析:存儲結(jié)構(gòu)如下
紅色填充內(nèi)存為結(jié)構(gòu)體成員a,因其為double類型且是第一個成員,由規(guī)則(1)可得如下;橙色填充為結(jié)構(gòu)體成員b,因其為char類型且不是第一個成員,由規(guī)則(2)可得如下;綠色填充為結(jié)構(gòu)體成員c,因其為int類型且不是第一個成員,由規(guī)則(2)(3)可得如下;畫紅叉內(nèi)存位置屬于因?qū)R造成的浪費內(nèi)存。
實例四:
分析:存儲結(jié)構(gòu)圖如下
紅色填充內(nèi)存為結(jié)構(gòu)體成員a,因其為double類型且是第一個成員,由規(guī)則(1)可得如下;橙色填充為結(jié)構(gòu)體成員s3,因其為嵌套結(jié)構(gòu)體且不是第一個成員,大小為16,由規(guī)則(4)可得如下圖;綠色填充為結(jié)構(gòu)體成員c,因其為int類型且不是第一個成員,由規(guī)則(2)(3)可得如下;畫紅叉內(nèi)存位置屬于因?qū)R造成的浪費內(nèi)存。
總結(jié)
到此這篇關(guān)于C語言結(jié)構(gòu)體內(nèi)存對齊詳解的文章就介紹到這了,更多相關(guān)C語言結(jié)構(gòu)體內(nèi)存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ float轉(zhuǎn)std::string 小數(shù)位數(shù)控制問題
這篇文章主要介紹了C++ float轉(zhuǎn)std::string 小數(shù)位數(shù)控制問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11C++ 使用CRC32檢測內(nèi)存映像完整性的實現(xiàn)步驟
當(dāng)我們使用動態(tài)補(bǔ)丁的時候,那么內(nèi)存中同樣不存在校驗效果,也就無法抵御對方動態(tài)修改機(jī)器碼了,為了防止解密者直接對內(nèi)存打補(bǔ)丁,我們需要在硬盤校驗的基礎(chǔ)上,增加內(nèi)存校驗,防止動態(tài)補(bǔ)丁的運用。2021-06-06C語言關(guān)于自定義數(shù)據(jù)類型之枚舉和聯(lián)合體詳解
枚舉顧名思義就是把所有的可能性列舉出來,像一個星期分為七天我們就可以使用枚舉,聯(lián)合體是由關(guān)鍵字union和標(biāo)簽定義的,和枚舉是一樣的定義方式,不一樣的是,一個聯(lián)合體只有一塊內(nèi)存空間,什么意思呢,就相當(dāng)于只開辟最大的變量的內(nèi)存,其他的變量都在那個變量占據(jù)空間2021-11-11通過c++11改進(jìn)我們的模式之改進(jìn)命令模式
這篇我要講的是如何使用c++11改進(jìn)命令模式,感興趣的朋友可以看下2013-11-11