C語(yǔ)言詳解熱門考點(diǎn)結(jié)構(gòu)體內(nèi)存對(duì)齊
一、為什么存在內(nèi)存對(duì)齊
大部分的參考資料都是如是說(shuō)的:
1.平臺(tái)原因(移植原因):不是所有的硬件平臺(tái)都能訪問任意地址上的任意數(shù)據(jù)的;某些硬件平臺(tái)只能再某些地址處取某些特定類型的數(shù)據(jù),否則拋出硬件異常。
2.性能原因:數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地再自然邊界上對(duì)齊。原因在于,為了訪問未對(duì)其的內(nèi)存,處理器需要作兩次內(nèi)存訪問;而對(duì)齊的內(nèi)存訪問僅需要一次訪問。
總體來(lái)說(shuō):結(jié)構(gòu)體的內(nèi)存對(duì)齊是拿空間來(lái)?yè)Q取時(shí)間的做法
二、如何計(jì)算?(考點(diǎn))
首先得掌握結(jié)構(gòu)體得對(duì)齊規(guī)則:
1.第一個(gè)成員再與結(jié)構(gòu)體變量偏移量為0得地址處。
2.其他成員變量要對(duì)齊到自身對(duì)齊數(shù)得整數(shù)倍得地址處。
- 對(duì)齊數(shù) = 編譯器默認(rèn)得一個(gè)對(duì)齊數(shù) 與 該成員大小的較小值 (VS中默認(rèn)的值為8)
3.結(jié)構(gòu)體總大小為最大對(duì)齊數(shù)(每個(gè)成員變量都有一個(gè)對(duì)齊數(shù))的整數(shù)倍。
4.如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對(duì)齊到自己的最大對(duì)齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整體大小就是所有最大對(duì)齊數(shù)(含嵌套結(jié)構(gòu)體的對(duì)齊數(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位,太多了就沒畫圖哈哈)。謝謝大家耐心讀到這里,如果這篇文章對(duì)你有所幫助,還請(qǐng)三連支持!
到此這篇關(guān)于C語(yǔ)言詳解熱門考點(diǎn)結(jié)構(gòu)體內(nèi)存對(duì)齊的文章就介紹到這了,更多相關(guān)C語(yǔ)言 內(nèi)存對(duì)齊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C語(yǔ)言中fseek函數(shù)和ftell函數(shù)的使用方法
這篇文章主要介紹了C語(yǔ)言中fseek函數(shù)和ftell函數(shù)的使用方法,兩個(gè)函數(shù)分別用于設(shè)置和返回文件指針stream的位置,需要的朋友可以參考下2016-03-03
關(guān)于PCL出現(xiàn)"無(wú)法找到?pcl_commond.dll?文件程序無(wú)法執(zhí)行"的問題及解決方法
這篇文章主要介紹了PCL出現(xiàn)"無(wú)法找到?pcl_commond.dll?文件程序無(wú)法執(zhí)行"的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單推箱子游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單推箱子游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02
C++?STL容器詳解之紅黑樹部分模擬實(shí)現(xiàn)
本文主要對(duì)紅黑樹進(jìn)行了詳細(xì)介紹,并對(duì)其核心功能進(jìn)行了模擬實(shí)現(xiàn)。文中的代碼對(duì)我們的學(xué)習(xí)或工作有一定的價(jià)值,感興趣的小伙伴可以了解一下2021-12-12
理解C++編程中的std::function函數(shù)封裝
這篇文章主要介紹了理解C++編程中的std::function函數(shù)封裝,std::function是C++11標(biāo)準(zhǔn)中的新特性,需要的朋友可以參考下2016-04-04
websocket++簡(jiǎn)單使用及實(shí)例分析
下面小編就為大家?guī)?lái)一篇websocket++簡(jiǎn)單使用及實(shí)例分析。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05

