網(wǎng)站首頁 編程語言 正文
一、為什么存在內(nèi)存對齊
????????大部分的參考資料都是如是說的:
????????1.平臺原因(移植原因):不是所有的硬件平臺都能訪問任意地址上的任意數(shù)據(jù)的;某些硬件平臺只能再某些地址處取某些特定類型的數(shù)據(jù),否則拋出硬件異常。
????????2.性能原因:數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地再自然邊界上對齊。原因在于,為了訪問未對其的內(nèi)存,處理器需要作兩次內(nèi)存訪問;而對齊的內(nèi)存訪問僅需要一次訪問。
????????總體來說:結(jié)構(gòu)體的內(nèi)存對齊是拿空間來換取時間的做法
二、如何計算?(考點)
????????首先得掌握結(jié)構(gòu)體得對齊規(guī)則:
1.第一個成員再與結(jié)構(gòu)體變量偏移量為0得地址處。
2.其他成員變量要對齊到自身對齊數(shù)得整數(shù)倍得地址處。
- 對齊數(shù) = 編譯器默認(rèn)得一個對齊數(shù) 與 該成員大小的較小值 (VS中默認(rèn)的值為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é)合下面練習(xí)把這塊知識點拿下。
練習(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位,太多了就沒畫圖哈哈)。謝謝大家耐心讀到這里,如果這篇文章對你有所幫助,還請三連支持!
原文鏈接:https://blog.csdn.net/qq_43460230/article/details/123976712
相關(guān)推薦
- 2022-03-23 如何解決Mac中的Docker宿主機與容器無法通信(MacOS下解決宿主機和docker容器網(wǎng)絡(luò)互通
- 2023-01-02 Oracle中sql語句如何執(zhí)行日志查詢_MsSql
- 2023-03-28 Python代碼庫之Tuple如何append添加元素問題_python
- 2022-11-28 iOS中NSThread使用示例詳解_IOS
- 2023-06-03 scipy稀疏數(shù)組dok_array的具體使用_python
- 2022-06-17 mongodb?數(shù)據(jù)塊的遷移流程分析_MongoDB
- 2022-07-30 SpringBoot的數(shù)據(jù)校驗(@Validated注解)、關(guān)于validation無法導(dǎo)入的問題解
- 2022-12-12 flutter?Bloc?add兩次只響應(yīng)一次問題解析_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支