1. 程式人生 > >正確的C++/C堆棧

正確的C++/C堆棧

程序 分區 常量 c中 變量 new 完成 堆棧 all

在理解C/C++內存分區時,常會碰到如下術語:數據區,堆,棧,靜態存儲區,靜態區,常量區,常變量區,全局區,字符串常量區,靜態常量區,靜態變量區,文字常量區,代碼區等等,初學者被搞得雲裏霧裏。在這裏,嘗試捋清楚以上分區的關系。[1] 數據區包括:堆,棧,全局/靜態存儲區。   全局/靜態存儲區包括:常量區(靜態常量區),全局區(全局變量區)和靜態變量區(靜態區)。   常量區包括:字符串常量區和常變量區。   代碼區:存放程序編譯後的二進制代碼,不可尋址區。 可以說,C/C++內存分區其實只有兩個,即代碼區和數據區。 一、真正合理的C++的內存劃分為棧區、堆區、全局區/靜態區和代碼區。 這裏去掉自由存儲區,增加了代碼區,理由會在下面講到。 棧區:由系統進行內存的管理。 說明:主要存放函數的參數以及局部變量。棧區由系統進行內存管理,在函數完成執行,系統自行釋放棧區內存,不需要用戶管理。整個程序的棧區的大小可以在編譯器中由用戶自行設定,默認的棧區大小為3M。 堆區:由用戶手動申請,手動釋放。在C中使用malloc,在C++中使用new(當然C++中也可以使用malloc)。 全局/靜態區:全局、靜態數據存放在一起的,初始化的全局變量和靜態變量是在一起的。未初始化的全局變量和靜態變量是在相鄰的空間中。這裏包括常量區。 代碼區:存放程序體的二進制代碼。比如我們寫的函數,都是在代碼區的。

正確的C++/C堆棧