C語言詳解熱門考點(diǎn)結(jié)構(gòu)體內(nèi)存對齊
一、為什么存在內(nèi)存對齊
大部分的參考資料都是如是說的:
1.平臺(tái)原因(移植原因):不是所有的硬件平臺(tái)都能訪問任意地址上的任意數(shù)據(jù)的;某些硬件平臺(tái)只能再某些地址處取某些特定類型的數(shù)據(jù),否則拋出硬件異常。
2.性能原因:數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地再自然邊界上對齊。原因在于,為了訪問未對其的內(nèi)存,處理器需要作兩次內(nèi)存訪問;而對齊的內(nèi)存訪問僅需要一次訪問。
總體來說:結(jié)構(gòu)體的內(nèi)存對齊是拿空間來換取時(shí)間的做法
二、如何計(jì)算?(考點(diǎn))
首先得掌握結(jié)構(gòu)體得對齊規(guī)則:
1.第一個(gè)成員再與結(jié)構(gòu)體變量偏移量為0得地址處。
2.其他成員變量要對齊到自身對齊數(shù)得整數(shù)倍得地址處。
- 對齊數(shù) = 編譯器默認(rèn)得一個(gè)對齊數(shù) 與 該成員大小的較小值 (VS中默認(rèn)的值為8)
3.結(jié)構(gòu)體總大小為最大對齊數(shù)(每個(gè)成員變量都有一個(gè)對齊數(shù))的整數(shù)倍。
4.如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對齊到自己的最大對齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整體大小就是所有最大對齊數(shù)(含嵌套結(jié)構(gòu)體的對齊數(shù))的整數(shù)倍。
三、手撕代碼
上面的干貨太干了是不是,小伙伴們可以多讀幾遍,結(jié)合下面練習(xí)把這塊知識(shí)點(diǎn)拿下。
練習(xí)1:
struct s1 { char c1; int i; char c2; }; printf("%d\n", sizeof(struct s1)); //12
練習(xí)2:
struct s2 { char c1; char c2; int i; }; printf("%d\n", sizeof(struct s2)); //8
練習(xí)3:
struct s3 { double d; char c; int i; }; printf("%d\n", sizeof(struct s3)); //16
練習(xí)4:
struct s4 { char c1; //0 struct s3 s; //8-23 double d; //24-31 int i; }; printf("%d\n", sizeof(struct s4));//32
這是嵌套結(jié)構(gòu)體的情況,在內(nèi)存中所占的每一位已標(biāo)出(要32位,太多了就沒畫圖哈哈)。謝謝大家耐心讀到這里,如果這篇文章對你有所幫助,還請三連支持!
到此這篇關(guān)于C語言詳解熱門考點(diǎn)結(jié)構(gòu)體內(nèi)存對齊的文章就介紹到這了,更多相關(guān)C語言 內(nèi)存對齊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
StretchBlt函數(shù)和BitBlt函數(shù)用法案例詳解
這篇文章主要介紹了StretchBlt函數(shù)和BitBlt函數(shù)用法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Qt結(jié)合libqrencode生成二維碼的實(shí)現(xiàn)示例
本文主要介紹了Qt結(jié)合libqrencode生成二維碼的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01解析C++中不能重載為友元函數(shù)的四個(gè)運(yùn)算符
以下是對C++中不能重載為友元函數(shù)的四個(gè)運(yùn)算符進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-07-07c語言統(tǒng)計(jì)素?cái)?shù)之和的實(shí)例
這篇文章主要介紹了c語言統(tǒng)計(jì)素?cái)?shù)之和的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12