靜態常量和常量靜態的區別/static const int a=10;在c/c++中是存到常量存儲區還是靜態存儲區


  首先我們討論應該是針對於C++而言,因為在C語言中,const沒有什么作用,更像是一個標記來標記某個變量是否可變。所以在C語言中,只要帶static必定是存在靜態/全局區中。

  其次,我們討論在C++中的情況。首先有一個概念需要了解,在C++中,常量儲存在常量存儲區,而常量存儲區是放在代碼段中的,“不占內存”。而靜態變量儲存在靜態/全局區,靜態/全局區是在內存空間中的,在其所屬的類中是全局的。

  上面我們所說的常量存儲區放在代碼中不占內存一定是有爭議的。這里的話,又有一個概念即動態的內存和靜態的內存之間的區別。以win32程序為例。程序執行時,操作系統將exe文件映射入內存。exe文件格式為頭數據和各段數據組成。頭數據說明了exe文件的屬性和執行環境,段數據又分為數據段,代碼段,資源段等,段的多少和位置由頭數據說明。也就是說,不僅僅只是代碼段和數據段。這些段由不同的編譯環境和編譯參數控制,由編譯器自動生成exe的段和文件格式。當操作系統執行exe時,會動態建立堆棧段,它是動態的,並且屬於操作系統執行環境。也就是說,程序在內存的映射一個為exe文件映射,包括數據段、代碼段等它是不變的。另一個為堆棧段,它是隨程序運行動態改變的。所以說,上面的不占內存,並不是說真的不占內存,而是說由於全局變量存在全局區中,即代碼段中,而代碼段所用的內存區域的大小並不會隨着全局變量的多少而改變,所以說一個全局變量在代碼段中不占內存是可以的。如自定義的變量等,使用的是堆棧區,堆棧區的大小會隨着變量的不斷增加而增加,所以說是“占內存的“。

  接下來就是最后一個問題,就是靜態常量到底是存儲在那一片內存區域?這里的話我還是盜用他人的調查結果,網上的也是雜七雜八的,但一般來說只要是靜態的都在靜態/全局區中(太懶了,沒有調查沒有發言權QAQ)

  結果是靜態常量和常量靜態基本的用法/初始化等是沒有區別的,且都存儲在靜態/常量區

 

 

 

 

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM