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

詳解C++中的自動(dòng)存儲(chǔ)

 更新時(shí)間:2020年09月27日 10:33:13   作者:chuyaoxin  
這篇文章主要介紹了詳解C++中的自動(dòng)存儲(chǔ),幫助大家更好的理解和學(xué)習(xí)C++,感興趣的朋友可以了解下

C++有3種管理數(shù)據(jù)內(nèi)存的方式即自動(dòng)存儲(chǔ)(棧存儲(chǔ))、靜態(tài)存儲(chǔ)和動(dòng)態(tài)存儲(chǔ)(堆存儲(chǔ))。在不同的方式下,內(nèi)存的分配形式和存在時(shí)間的長短都不同。

下面對(duì)自動(dòng)存儲(chǔ)進(jìn)行說明。

自動(dòng)存儲(chǔ)(棧存儲(chǔ))

對(duì)于函數(shù)的形參、內(nèi)部聲明的變量及結(jié)構(gòu)變量等,編譯器將在函數(shù)執(zhí)行時(shí)為形參自動(dòng)分配存儲(chǔ)空間,在執(zhí)行到變量和結(jié)構(gòu)變量等的聲明語句時(shí)為其自動(dòng)分配存儲(chǔ)空間,因此稱其為自動(dòng)變量(Automatic Variable),有的教科書也稱其為局部變量,在函數(shù)執(zhí)行完畢返回時(shí),這些變量將被撤銷,對(duì)應(yīng)的內(nèi)存空間將被釋放。

事實(shí)上,自動(dòng)變量的生存期只局限于它所在的代碼塊。所謂代碼塊,是包含在花括號(hào)對(duì)中的一段代碼,函數(shù)只是代碼塊的一種,比較下面兩段代碼。

代碼段1

int add(int m,int n)

{

  //z的生存期包括整個(gè)函數(shù)

  int z=m+n;

  return z;

}

代碼段2

int add(int m,int n)

{

  if(m!=0)

  {

    //z的生存期包括在這個(gè)代碼塊中

    int z=m+n;

  }

  return z;//錯(cuò)誤

}

在代碼段1中,當(dāng)函數(shù)返回時(shí),變量z被撤銷,對(duì)應(yīng)內(nèi)存空間被釋放,但在代碼段2中,在if代碼塊中聲明的變量z,其生存期僅限于if結(jié)構(gòu)的兩個(gè)花括號(hào)之間,當(dāng)程序執(zhí)行到if結(jié)構(gòu)的后花括號(hào)時(shí),變量z已被撤銷,其對(duì)應(yīng)的內(nèi)存空間被釋放,此時(shí),再執(zhí)行“return z;”語句便會(huì)出錯(cuò)。

注意

理解代碼塊的含義十分重要,花括號(hào)不是判斷代碼塊的唯一標(biāo)準(zhǔn),把代碼段2中if結(jié)構(gòu)的花括號(hào)去掉,代碼仍然是錯(cuò)誤的,將“return z;”放在if結(jié)構(gòu)中是正確的用法。

自動(dòng)變量的生存期是局部的,這一特性使得程序員可以在不同的塊內(nèi)使用相同的變量名,用不著為使用不同的變量名絞盡腦汁。

1.什么是“?!?br />

棧(Stack)是一塊存儲(chǔ)區(qū),而且是C++程序使用最頻繁的存儲(chǔ)區(qū),其存儲(chǔ)機(jī)理為“FILO”,即先進(jìn)后出(First In,Last Out)??梢詫⑵湎胂蟪梢粋€(gè)裝盤子的桶,最早放入的盤子在桶的底部,最晚放入的盤子在最頂部,取盤子時(shí)必須先從后放進(jìn)去的盤子開始取,這就是所謂的先進(jìn)后出原則。當(dāng)一個(gè)代碼塊(包括函數(shù),視為一種特殊的代碼塊)聲明一個(gè)自動(dòng)變量時(shí),系統(tǒng)便為其在棧中開辟內(nèi)存空間(常稱“壓入”push),該代碼塊結(jié)束后便將自動(dòng)變量撤銷,釋放內(nèi)存空間(常稱“彈出”pop)。

注意

采用“?!边@種機(jī)制,C++程序能有效地節(jié)省所用內(nèi)存空間。

2.auto關(guān)鍵字

auto是C++提供的存儲(chǔ)類聲明符,用于聲明自動(dòng)變量,除了auto聲明符外,C++還提供了另外3個(gè)存儲(chǔ)類聲明符,分別是register(寄存器存儲(chǔ))、extern(外部存儲(chǔ))和static(靜態(tài)存儲(chǔ))。在聲明創(chuàng)建變量時(shí),存儲(chǔ)類聲明符應(yīng)放在數(shù)據(jù)類型聲明符之前,如下所示。

存儲(chǔ)類聲明符 數(shù)據(jù)類型 變量名[=初始化表達(dá)式]

其中,初始化表達(dá)式是可選的,如下列代碼聲明創(chuàng)建了int型自動(dòng)變量A,其只在函數(shù)demo()執(zhí)行期間存在,demo()函數(shù)執(zhí)行完畢后,變量A被撤銷,對(duì)應(yīng)內(nèi)存被釋放。

void demo()

{

  ……

  auto int A;

  ……

}

在前面給出的示例代碼在聲明自動(dòng)變量時(shí)并沒有加auto修飾符,實(shí)際上,auto常??梢阅J(rèn),凡是在函數(shù)內(nèi)部(不論是main()函數(shù)還是其他函數(shù))的,沒有用其他顯式的存儲(chǔ)類型聲明符,編譯器都認(rèn)為是auto型自動(dòng)變量。

3.register關(guān)鍵字

除了auto外,還可以通過存儲(chǔ)類聲明符register來聲明自動(dòng)變量,與auto唯一的不同在于:關(guān)鍵字register通知編譯器,用戶希望通過CPU寄存器,而不是“棧”來處理某個(gè)變量,從而可以在一定程度上加快該變量的訪問速度。

提示

一般來說,CPU對(duì)寄存器的訪問要快過對(duì)內(nèi)存的訪問。

用register聲明的變量常稱為寄存器變量,舉例來說,下列代碼聲明了int型寄存器變量sum,并將其初始化為9,如下所示。

register int sum=9;

需要注意的是,即使用register聲明了某個(gè)變量,編譯器也不一定會(huì)滿足它的要求。因?yàn)?,CPU寄存器可能被占用或者無法存儲(chǔ)指定類型的數(shù)據(jù)等,而且,現(xiàn)在的編譯器一般可以自動(dòng)決定應(yīng)把哪些變量放在CPU寄存器中,因此,在C++程序中,register關(guān)鍵字很少使用。

使用register關(guān)鍵字會(huì)帶來一定的負(fù)面效果,不管是否能滿足要求,編譯器認(rèn)為register型自動(dòng)變量是存儲(chǔ)在CPU寄存器中的,而寄存器是沒有內(nèi)存地址的,所以,不能對(duì)register型自動(dòng)變量進(jìn)行取地址操作,下列代碼是錯(cuò)誤的。

void demo()

{

  ……

  register int sum=0;

  int*pSum=∑

  ……

}

注意

事實(shí)上,用auto和register聲明的變量除了存儲(chǔ)位置不同(一個(gè)是“?!保硪粋€(gè)可能是“?!币部赡苁荂PU寄存器)外,并無其他差異,我們可以將其統(tǒng)稱為自動(dòng)變量來考慮。

4.自動(dòng)變量的初始化

可以在聲明自動(dòng)變量時(shí)對(duì)其進(jìn)行初始化,也可以使用任何具有確定值的表達(dá)式為自動(dòng)變量賦值,下列語句都是合法的(假定n為int型自動(dòng)變量)。

n=2;

n=5*m;//m的值確定

n=add(4,6);

需要特別注意的是,如果沒有在自動(dòng)變量聲明的同時(shí)對(duì)其初始化,其初始值是隨機(jī)、不可預(yù)料的,為避免隨機(jī)的初始值給程序帶來麻煩,推薦在聲明自動(dòng)變量的同時(shí)對(duì)其顯式初始化。

以上就是詳解C++中的自動(dòng)存儲(chǔ)的詳細(xì)內(nèi)容,更多關(guān)于C++ 自動(dòng)存儲(chǔ)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言可變參數(shù)函數(shù)詳解

    C語言可變參數(shù)函數(shù)詳解

    在某些情況下我們希望函數(shù)的參數(shù)個(gè)數(shù)可以根據(jù)需要確定,因此c語言引入可變參數(shù)函數(shù)。典型的可變參數(shù)函數(shù)的例子有printf()、scanf()等,下面我就開始講解
    2021-08-08
  • C++ vector模擬實(shí)現(xiàn)的代碼詳解

    C++ vector模擬實(shí)現(xiàn)的代碼詳解

    vector是表示可變大小數(shù)組的序列容器,就像數(shù)組一樣,vector也采用的連續(xù)存儲(chǔ)空間來存儲(chǔ)元素,本質(zhì)講,vector使用動(dòng)態(tài)分配數(shù)組來存儲(chǔ)它的元素,本文將給大家詳細(xì)介紹一下C++ vector模擬實(shí)現(xiàn),需要的朋友可以參考下
    2023-07-07
  • Qt讀取和寫入配置(ini)文件

    Qt讀取和寫入配置(ini)文件

    ini文件在windows系統(tǒng)中可以存儲(chǔ)需要持久保存的配置信息,本文主要介紹了Qt讀取和寫入配置(ini)文件,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • MoveWindow() SetWindowPos()的區(qū)別于聯(lián)系

    MoveWindow() SetWindowPos()的區(qū)別于聯(lián)系

    這篇文章主要介紹了VC++中MoveWindow() SetWindowPos()的區(qū)別于聯(lián)系,需要的朋友可以參考下
    2015-01-01
  • 深入淺析C/C++語言結(jié)構(gòu)體指針的使用注意事項(xiàng)

    深入淺析C/C++語言結(jié)構(gòu)體指針的使用注意事項(xiàng)

    這篇文章主要介紹了C/C++語言結(jié)構(gòu)體指針的使用,大家都知道指針在32位系統(tǒng)占用4Byte,在64位系統(tǒng)占用8Byte,下面看下c語言代碼例子
    2021-12-12
  • C語言中sizeof函數(shù)踩過的坑總結(jié)

    C語言中sizeof函數(shù)踩過的坑總結(jié)

    sizeof是C語言的一種單目操作符,如C語言的其他操作符++、--等。它并不是函數(shù)。sizeof操作符以字節(jié)形式給出了其操作數(shù)的存儲(chǔ)大小。操作數(shù)可以是一個(gè)表達(dá)式或括在括號(hào)內(nèi)的類型名。操作數(shù)的存儲(chǔ)大小由操作數(shù)的類型決定
    2022-04-04
  • Cocos2d-x學(xué)習(xí)筆記之開發(fā)環(huán)境搭建

    Cocos2d-x學(xué)習(xí)筆記之開發(fā)環(huán)境搭建

    這篇文章主要介紹了Cocos2d-x學(xué)習(xí)筆記之開發(fā)環(huán)境搭建,本文使用Visual Studio作為開發(fā)IDE,是不同于其它教程的,需要的朋友可以參考下
    2014-09-09
  • C語言超詳細(xì)講解文件的操作

    C語言超詳細(xì)講解文件的操作

    C語言文件操作的方法有很多,函數(shù)也有很多你知道哪些呢?下面是小編為大家?guī)淼腃語言文件操作的方法,歡迎閱讀
    2022-04-04
  • C++計(jì)算任意兩個(gè)日期天數(shù)差的方法詳解

    C++計(jì)算任意兩個(gè)日期天數(shù)差的方法詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)任意兩個(gè)日期天數(shù)差,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下
    2024-02-02
  • 使用C++將處理后的信號(hào)保存為PNG和TIFF格式

    使用C++將處理后的信號(hào)保存為PNG和TIFF格式

    在信號(hào)處理領(lǐng)域,我們常常需要將處理結(jié)果以圖像的形式保存下來,方便后續(xù)分析和展示,C++提供了多種庫來處理圖像數(shù)據(jù),本文將介紹如何使用stb_image_write庫保存為PNG格式圖像以及使用OpenCV庫保存為TIFF格式圖像,需要的朋友可以參考下
    2025-02-02

最新評(píng)論

汝南县| 巴彦县| 界首市| 普定县| 襄汾县| 乡宁县| 金昌市| 宁南县| 宁国市| 奉节县| 静安区| 通许县| 科技| 运城市| 仲巴县| 通州市| 罗江县| 华亭县| 通州市| 界首市| 安达市| 曲沃县| 军事| 华阴市| 高邑县| 龙胜| 彰化市| 武川县| 水富县| 忻城县| 皋兰县| 敦煌市| 德化县| 宁河县| 开平市| 蓬莱市| 柳林县| 诸城市| 乐山市| 天峻县| 乌拉特前旗|