日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

变量的生存期和存储分配

發布時間:2025/3/14 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 变量的生存期和存储分配 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.變量的生存期 

 變量是內存空間的一種抽象,程序中定義的每個變量在運行時都有與之對應的內存空間。

  C++把變量占有的內存空間的時間段稱為生存期,分為三類:靜態生存期、動態生存期、自動生存期

  • 全局變量具有靜態生存期;
  • 局部變量和函數的參數一般具有自動生存期;
  • 對于具有動態生存期的變量,其內存空間一般用new操作分配,用delete操作收回,這樣的變量稱為動態變量,動態變量具有動態生存期。

  定義局部變量時,可以加上存儲類型修飾符:auto、static或register來顯式地指出他們的生存周期。

  • 局部變量的默認存儲類型為auto;
  • 定義static存儲類型的局部變量具有靜態生存期;
  • 定義register存儲類的局部變量也具有自動生存期,與auto存儲類的局部變量的區別在于register是建議編譯程序將相應的局部變量的空間分配在CPU的存儲器中,目的是提高對局部變量的訪問效率,當然,register類型的局部變量的存儲空間也可以在CPU的寄存器中,或者內存中。

  在C++程序中,定義的一個變量如果沒有初始化,對于具有靜態生存期的變量(全局變量、static存儲類的局部變量),程序會隱式地自動把他們按位模式初始化為0;對于其他變量,編譯程序不會初始化,初始值為內存空間已有的值,具有不確定性。

2.作用

  • 自動的局部變量起到節省內存空間的作用,當包含auto存儲類的局部變量的函數調用結束后,其中的自動局部變量的內存就被收回了。
  • static存儲類的局部變量的作用是,能在函數調用時獲得上一次調用結束時該局部變量的值,即能在函數多次調用之間得以保留。

特別注意的是,static存儲類的局部變量如果在定義中初始化,則該初始化只在函數第一次調用時進行,后面的調用中不再初始化,它的值為上一次調用結束時的值,受函數封裝的保護。

3.存儲的分配  

  當一個程序運行時,操作系統會為其分配一個內存空間,包括四個部分:靜態數據區(static data)、代碼區(code)、棧區(stack)和堆區(heap,或稱自由存儲區,free store),如下圖所示(不同操作系統的順序會不同)。

  在程序的內存空間中:

  • 靜態數據區用于全局變量、static存儲類的局部變量以及變量的內存分配;
  • 代碼區用于存放程序的指令,對于C++,代碼區存放的是所有函數的代碼;
  • 棧區用于auto存儲類的局部變量、函數的參數,及函數調用時的有關信息(如函數的返回地址等)的內存分配;
  • 堆區用于動態變量的內存分配

?  靜態數據區和代碼區的大小是固定的,而棧區和堆區的大小將會隨著程序的運行不斷變化,不過,操作系統對于程序的棧區和堆區的最大值有一定的限制。

4.基于棧的函數調用的實現

  函數調用是通過棧來實現的,棧是一種元素個數可變的線性數據結構。其元素的增加和減少只能在某一端進行。

  • 在C++函數調用時,調用者在棧中為形參函數返回地址分配空間,并將函數中實參的值和調用后的返回地址放入所分配的棧空間中;
  • 函數調用中,被調用的函數在棧中為自動存儲類的局部變量分配空間,并從棧中(通過形參)獲得調用者提供的數據(實參的值);
  • 函數調用后,被調用者釋放局部變量的棧空間,并根據棧空間的返回地址返回到調用點(存儲返回地址的棧空間將被釋放);
  • 調用者釋放形參占用的的棧空間,然后繼續執行調用之后的操作。
  • 堆棧順序:形參->函數返回地址->函數內的auto局部變量

    ???

    ?

    轉載于:https://www.cnblogs.com/guojun-junguo/p/9998236.html

    總結

    以上是生活随笔為你收集整理的变量的生存期和存储分配的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。