变量的生存期和存储分配
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.基于棧的函數調用的實現
函數調用是通過棧來實現的,棧是一種元素個數可變的線性數據結構。其元素的增加和減少只能在某一端進行。
堆棧順序:形參->函數返回地址->函數內的auto局部變量
???
?
轉載于:https://www.cnblogs.com/guojun-junguo/p/9998236.html
總結
以上是生活随笔為你收集整理的变量的生存期和存储分配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: luogu3233 世界树 (虚树)
- 下一篇: 一个公告栏