C語言詳解熱門考點結(jié)構(gòu)體內(nèi)存對齊
一、為什么存在內(nèi)存對齊
大部分的參考資料都是如是說的:
1.平臺原因(移植原因):不是所有的硬件平臺都能訪問任意地址上的任意數(shù)據(jù)的;某些硬件平臺只能再某些地址處取某些特定類型的數(shù)據(jù),否則拋出硬件異常。
2.性能原因:數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應該盡可能地再自然邊界上對齊。原因在于,為了訪問未對其的內(nèi)存,處理器需要作兩次內(nèi)存訪問;而對齊的內(nèi)存訪問僅需要一次訪問。
總體來說:結(jié)構(gòu)體的內(nèi)存對齊是拿空間來換取時間的做法
二、如何計算?(考點)
首先得掌握結(jié)構(gòu)體得對齊規(guī)則:
1.第一個成員再與結(jié)構(gòu)體變量偏移量為0得地址處。
2.其他成員變量要對齊到自身對齊數(shù)得整數(shù)倍得地址處。
- 對齊數(shù) = 編譯器默認得一個對齊數(shù) 與 該成員大小的較小值 (VS中默認的值為8)
3.結(jié)構(gòu)體總大小為最大對齊數(shù)(每個成員變量都有一個對齊數(shù))的整數(shù)倍。
4.如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對齊到自己的最大對齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整體大小就是所有最大對齊數(shù)(含嵌套結(jié)構(gòu)體的對齊數(shù))的整數(shù)倍。
三、手撕代碼
上面的干貨太干了是不是,小伙伴們可以多讀幾遍,結(jié)合下面練習把這塊知識點拿下。
練習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這是嵌套結(jié)構(gòu)體的情況,在內(nèi)存中所占的每一位已標出(要32位,太多了就沒畫圖哈哈)。謝謝大家耐心讀到這里,如果這篇文章對你有所幫助,還請三連支持!
到此這篇關于C語言詳解熱門考點結(jié)構(gòu)體內(nèi)存對齊的文章就介紹到這了,更多相關C語言 內(nèi)存對齊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解C語言中fseek函數(shù)和ftell函數(shù)的使用方法
這篇文章主要介紹了C語言中fseek函數(shù)和ftell函數(shù)的使用方法,兩個函數(shù)分別用于設置和返回文件指針stream的位置,需要的朋友可以參考下2016-03-03
關于PCL出現(xiàn)"無法找到?pcl_commond.dll?文件程序無法執(zhí)行"的問題及解決方法
這篇文章主要介紹了PCL出現(xiàn)"無法找到?pcl_commond.dll?文件程序無法執(zhí)行"的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07
理解C++編程中的std::function函數(shù)封裝
這篇文章主要介紹了理解C++編程中的std::function函數(shù)封裝,std::function是C++11標準中的新特性,需要的朋友可以參考下2016-04-04

