網站首頁 編程語言 正文
存儲持續性(生命周期)
課堂上都講過,變量有生命周期和作用域,類似的在C++中也有存儲持續性與連接性的概念。什么是自動變量,什么是靜態變量,什么是全局變量?本文就來解答一下。
存儲持續性說的就是數據在內存中保留的時間。
先來看看下面這段代碼是否有問題?
*int getInt() {
int a = 1;
return &a;
}
我們知道函數調用和返回在內存中對應入棧出棧的過程。這個函數將函數內部創建的自動變量a的指針作為返回值返回,變量a分配在棧中,當函數返回,這塊內存空間出棧被回收,導致返回的指針也就成了懸掛指針,指向了一塊不屬于它的地址。
在Go等一些語言中,這樣的代碼沒有問題,這是因為逃逸機制,在函數返回時可以將棧上的變量a逃逸到堆上。但C++沒有逃逸機制,因此函數返回時,a的內存空間被回收,返回的指針也就成了懸掛指針,指向了一塊不屬于它的地址。
聽上去有了逃逸機制,就不需要考慮這類問題,為什么C++沒有呢?凡事都有代價,有逃逸機制就需要有垃圾回收,而垃圾回收不僅復雜,更是會占用程序運行時間。而C++選擇犧牲開發的便利性,以獲得更高的運行時性能。
事實上,如果想實現這樣的功能,在C++中也可以使用智能指針來實現。一些語言中可以無腦使用的功能,在C++中需要一些學習門檻,這也是為什么有些語言學習曲線陡峭了。但相對應的,學習曲線陡峭也是在逼著我們程序員去學習更底層原理的知識,只有足夠了解它才能駕馭它,也是這類語言的魅力所在。
C++中的存儲持續性有4類
- 自動存儲持續性
- 靜態存儲持續性
- 動態存儲持續性
- 線程存儲持續性 (C++11新增,本文不討論)
自動存儲持續性
上例的代碼中就說明了自動存儲持續性的特點:在函數或代碼塊內聲明的變量,在離開代碼塊之后,其內存會被回收。
自動變量不會進行自動初始化,如果沒有顯示初始化,那么聲明后的變量內容可能是隨機值。
自動變量存儲在棧中。
靜態存儲持續性
靜態變量可以在程序運行期間一直保持在內存中,即便它在函數或代碼塊中聲明。而且,所有靜態變量都是在程序開始運行時就進入內存了,并不需要實際執行到變量聲明處。
靜態變量存儲在靜態存儲區。
那么如何聲明靜態變量呢?
你一定脫口而出 “static”。這并不準確。
- 如果變量在代碼塊中聲明,那么加上static則聲明為靜態
- 如果變量在代碼塊外聲明,則無論有沒有static,都是靜態變量。這時如果加static,則static則有另外的含義,表示鏈接性為內部。
靜態變量默認會初始化有兩類:靜態初始化和動態初始化。靜態初始化又包括零初始化和常量表達式初始化。
- 零初始化:靜態變量默認會進行零初始化
- 常量表達式初始化:在編譯期初始化
- 動態初始化:無法在編譯期初始化,則會在編譯后初始化??赡艿脑虬ǎ罕磉_式包含動態變量,需要調用其他文件的函數所以必須等鏈接后執行。
動態存儲持續性
動態是指用 new 分配的存儲空間,它從new語句執行,到delete語句執行,期間一直在內存中。它存儲在堆內存中。
但并不存在“動態變量”,只是將動態分配的地址賦給一個指針變量。指針本身有他的內存空間,但指針的內存被回收,并不會導致new分配的空間被回收。因此,使用new來申請的內存空間一定要用delete刪除。
原文鏈接:https://juejin.cn/post/7107997169595973646
相關推薦
- 2022-05-09 Python的Pandas時序數據詳解_python
- 2023-01-31 Python函數用法和底層原理分析_python
- 2022-03-30 Android?RecyclerView曝光采集的實現方法_Android
- 2022-04-09 SpringBoot上傳文件并配置本地資源映射來訪問文件
- 2022-08-03 在Oracle表中進行關鍵詞搜索的過程_oracle
- 2023-03-03 一文詳解Go?Http?Server原理_Golang
- 2022-05-03 SQL?Server查詢某個字段在哪些表中存在_MsSql
- 2024-01-28 spring自動配置的原理
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支