最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++存儲(chǔ)持續(xù)性生命周期原理解析

 更新時(shí)間:2023年01月03日 16:29:53   作者:碼小方  
這篇文章主要為大家介紹了C++存儲(chǔ)持續(xù)性生命周期原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

存儲(chǔ)持續(xù)性(生命周期)

課堂上都講過,變量有生命周期和作用域,類似的在C++中也有存儲(chǔ)持續(xù)性與連接性的概念。什么是自動(dòng)變量,什么是靜態(tài)變量,什么是全局變量?本文就來解答一下。

存儲(chǔ)持續(xù)性說的就是數(shù)據(jù)在內(nèi)存中保留的時(shí)間。

先來看看下面這段代碼是否有問題?

*int getInt() {
  int a = 1;
  return &a;
}

我們知道函數(shù)調(diào)用和返回在內(nèi)存中對(duì)應(yīng)入棧出棧的過程。這個(gè)函數(shù)將函數(shù)內(nèi)部創(chuàng)建的自動(dòng)變量a的指針作為返回值返回,變量a分配在棧中,當(dāng)函數(shù)返回,這塊內(nèi)存空間出棧被回收,導(dǎo)致返回的指針也就成了懸掛指針,指向了一塊不屬于它的地址。

在Go等一些語言中,這樣的代碼沒有問題,這是因?yàn)樘右輽C(jī)制,在函數(shù)返回時(shí)可以將棧上的變量a逃逸到堆上。但C++沒有逃逸機(jī)制,因此函數(shù)返回時(shí),a的內(nèi)存空間被回收,返回的指針也就成了懸掛指針,指向了一塊不屬于它的地址。

聽上去有了逃逸機(jī)制,就不需要考慮這類問題,為什么C++沒有呢?凡事都有代價(jià),有逃逸機(jī)制就需要有垃圾回收,而垃圾回收不僅復(fù)雜,更是會(huì)占用程序運(yùn)行時(shí)間。而C++選擇犧牲開發(fā)的便利性,以獲得更高的運(yùn)行時(shí)性能。

事實(shí)上,如果想實(shí)現(xiàn)這樣的功能,在C++中也可以使用智能指針來實(shí)現(xiàn)。一些語言中可以無腦使用的功能,在C++中需要一些學(xué)習(xí)門檻,這也是為什么有些語言學(xué)習(xí)曲線陡峭了。但相對(duì)應(yīng)的,學(xué)習(xí)曲線陡峭也是在逼著我們程序員去學(xué)習(xí)更底層原理的知識(shí),只有足夠了解它才能駕馭它,也是這類語言的魅力所在。

C++中的存儲(chǔ)持續(xù)性有4類

  • 自動(dòng)存儲(chǔ)持續(xù)性
  • 靜態(tài)存儲(chǔ)持續(xù)性
  • 動(dòng)態(tài)存儲(chǔ)持續(xù)性
  • 線程存儲(chǔ)持續(xù)性 (C++11新增,本文不討論)

自動(dòng)存儲(chǔ)持續(xù)性

上例的代碼中就說明了自動(dòng)存儲(chǔ)持續(xù)性的特點(diǎn):在函數(shù)或代碼塊內(nèi)聲明的變量,在離開代碼塊之后,其內(nèi)存會(huì)被回收。

自動(dòng)變量不會(huì)進(jìn)行自動(dòng)初始化,如果沒有顯示初始化,那么聲明后的變量內(nèi)容可能是隨機(jī)值。

自動(dòng)變量存儲(chǔ)在棧中。

靜態(tài)存儲(chǔ)持續(xù)性

靜態(tài)變量可以在程序運(yùn)行期間一直保持在內(nèi)存中,即便它在函數(shù)或代碼塊中聲明。而且,所有靜態(tài)變量都是在程序開始運(yùn)行時(shí)就進(jìn)入內(nèi)存了,并不需要實(shí)際執(zhí)行到變量聲明處。

靜態(tài)變量存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū)。

那么如何聲明靜態(tài)變量呢?

你一定脫口而出 “static”。這并不準(zhǔn)確。

  • 如果變量在代碼塊中聲明,那么加上static則聲明為靜態(tài)
  • 如果變量在代碼塊外聲明,則無論有沒有static,都是靜態(tài)變量。這時(shí)如果加static,則static則有另外的含義,表示鏈接性為內(nèi)部。

靜態(tài)變量默認(rèn)會(huì)初始化有兩類:靜態(tài)初始化和動(dòng)態(tài)初始化。靜態(tài)初始化又包括零初始化和常量表達(dá)式初始化。

  • 零初始化:靜態(tài)變量默認(rèn)會(huì)進(jìn)行零初始化
  • 常量表達(dá)式初始化:在編譯期初始化
  • 動(dòng)態(tài)初始化:無法在編譯期初始化,則會(huì)在編譯后初始化??赡艿脑虬ǎ罕磉_(dá)式包含動(dòng)態(tài)變量,需要調(diào)用其他文件的函數(shù)所以必須等鏈接后執(zhí)行。

動(dòng)態(tài)存儲(chǔ)持續(xù)性

動(dòng)態(tài)是指用 new 分配的存儲(chǔ)空間,它從new語句執(zhí)行,到delete語句執(zhí)行,期間一直在內(nèi)存中。它存儲(chǔ)在堆內(nèi)存中。

但并不存在“動(dòng)態(tài)變量”,只是將動(dòng)態(tài)分配的地址賦給一個(gè)指針變量。指針本身有他的內(nèi)存空間,但指針的內(nèi)存被回收,并不會(huì)導(dǎo)致new分配的空間被回收。因此,使用new來申請(qǐng)的內(nèi)存空間一定要用delete刪除。

以上就是C++存儲(chǔ)持續(xù)性生命周期原理解析的詳細(xì)內(nèi)容,更多關(guān)于C++存儲(chǔ)持續(xù)性生命周期的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 如何高效移除C++關(guān)聯(lián)容器中的元素

    如何高效移除C++關(guān)聯(lián)容器中的元素

    關(guān)聯(lián)容器和順序容器有著很大不同,關(guān)聯(lián)容器中的元素是按照關(guān)鍵字來保存和訪問的,而順序容器中的元素是按它們?cè)谌萜髦械奈恢脕眄樞虮4婧驮L問的,本文介紹了如何高效移除C++關(guān)聯(lián)容器中的元素的方法,需要的朋友可以參考下
    2025-04-04
  • 詳解c++11以正確的姿勢(shì)輸出enum class的值

    詳解c++11以正確的姿勢(shì)輸出enum class的值

    這篇文章主要介紹了詳解c++11以正確的姿勢(shì)輸出enum class的值,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • C語言實(shí)現(xiàn)猜數(shù)字的小游戲

    C語言實(shí)現(xiàn)猜數(shù)字的小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)猜數(shù)字的小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • C語言深入了解函數(shù)

    C語言深入了解函數(shù)

    C語言函數(shù)是用來模塊化構(gòu)建程序的。如果你的功能少,你可以全都寫在mian函數(shù)中,但是當(dāng)實(shí)現(xiàn)功能多的時(shí)候,如果全寫在main的函數(shù)里,不僅代碼不美觀,而且函數(shù)實(shí)現(xiàn)的時(shí)候結(jié)構(gòu)復(fù)雜,代碼重復(fù)
    2022-05-05
  • C語言報(bào)錯(cuò):Buffer Overflow的原因和解決辦法

    C語言報(bào)錯(cuò):Buffer Overflow的原因和解決辦法

    Buffer Overflow是C語言中常見且危險(xiǎn)的內(nèi)存錯(cuò)誤之一,它通常在程序試圖向緩沖區(qū)(如數(shù)組或內(nèi)存塊)寫入超過其容量的數(shù)據(jù)時(shí)發(fā)生,本文將詳細(xì)介紹Buffer Overflow的產(chǎn)生原因,提供多種解決方案,需要的朋友可以參考下
    2024-07-07
  • 一篇文章帶你了解C++(STL基礎(chǔ)、Vector)

    一篇文章帶你了解C++(STL基礎(chǔ)、Vector)

    這篇文章主要為大家詳細(xì)介紹了C++ STL基礎(chǔ),vector向量容器使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-08-08
  • 詳解C++的靜態(tài)內(nèi)存分配與動(dòng)態(tài)內(nèi)存分配

    詳解C++的靜態(tài)內(nèi)存分配與動(dòng)態(tài)內(nèi)存分配

    內(nèi)存分配 (Memory Allocation) 是指為計(jì)算機(jī)程序或服務(wù)分配物理內(nèi)存空間或虛擬內(nèi)存空間的一個(gè)過程,本文主要介紹了C++的靜態(tài)內(nèi)存分配與動(dòng)態(tài)內(nèi)存分配,感興趣的同學(xué)可以參考閱讀
    2023-06-06
  • C++編程中變量的聲明和定義以及預(yù)處理命令解析

    C++編程中變量的聲明和定義以及預(yù)處理命令解析

    這篇文章主要介紹了C++編程中變量的聲明和定義以及預(yù)處理命令解析,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • VS2019+MPI配置過程的實(shí)現(xiàn)步驟

    VS2019+MPI配置過程的實(shí)現(xiàn)步驟

    本文介紹了在VS2019上配置MPI,包括下載和安裝MPI、創(chuàng)建項(xiàng)目、配置屬性、導(dǎo)入頭文件和庫文件、添加依賴項(xiàng)等步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-12-12
  • json error: Use of overloaded operator [] is ambiguous錯(cuò)誤的解決方法

    json error: Use of overloaded operator [] is ambiguous錯(cuò)誤的解決方

    今天小編就為大家分享一篇關(guān)于json error: Use of overloaded operator [] is ambiguous錯(cuò)誤的解決方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04

最新評(píng)論

昔阳县| 岳阳市| 民权县| 罗城| 宁津县| 元江| 海城市| 扎兰屯市| 卢湾区| 胶南市| 江北区| 安龙县| 谢通门县| 三江| 满洲里市| 石家庄市| 镇安县| 永福县| 寻乌县| 滦南县| 旬阳县| 铜梁县| 沂源县| 务川| 琼海市| 兴业县| 江门市| 丰宁| 龙里县| 皮山县| 韶关市| 南投县| 米泉市| 余江县| 宁明县| 庆城县| 临猗县| 郎溪县| 永城市| 平塘县| 平罗县|