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