C++各種變量、類型的存儲位置


先看看這張圖里面五個區域


 

就我自己的思考來設置一些問答。

1. 首先哪些變量會進行零初始化?

  如果沒有顯示地初始化靜態變量,編譯器將把它設置為0,在默認情況下,靜態數組和結構將每個元素或成員的所有位都設置為0。

2. char *p = "hello" 和 char p[6] = "hello"有什么區別?

  char *p = "hello", 對於*(p + 1) = 'a'這條語句是無法執行的,因為hello保存在常量字符串區,當你初始化賦值的時候,這些常量就先在文字常量區開辟一段空間,保存此常量,定義后是不能修改的。以后相同的常量就都在這里了。

  char p[6] = "hello",保存在棧區, 可以進行修改,空間由編譯器自動分配和釋放。

3. 五種變量存儲方式?

 存儲描述  持續性  作用域  鏈接性 如何聲明  其他信息 
 自動  自動   代碼塊  無   在代碼塊中  比如一些局部變量
 寄存器  自動  代碼塊  無  在代碼塊中,使用關鍵字register  
靜態,無鏈接性   靜態  代碼塊  無  在代碼塊中,使用關鍵字static  在函數內,函數退出,值仍然保留
靜態,外部鏈接性  靜態  文件  外部  不在任何函數內  extern
靜態,內部鏈接性  靜態  文件  內部  不在任何函數內,使用關鍵字static  所有函數共用

 

 

4. const的一些問題。

  const修飾的全局變量保存在代碼區中,const修飾的局部變量保存在棧段中。

  默認情況下,全局變量的鏈接性為外部的(其他文件要使用這個全局變量加上extern關鍵字), 而const修飾的全局變量是內部鏈接的,就像使用了static一樣。

5. 存儲說明符介紹。

  auto——在C++11之前是說明符, 顯式指出變量為自動存儲,現在是用於類型推斷,可以不考慮

  register——使用CPU寄存器來存儲變量,提高變量訪問的速度

  static——創建靜態的內部鏈接性、靜態無鏈接性的變量

  extern——創建靜態外部鏈接性的變量

  thread_local——C++11新增,變量的持續性與線程相同

  mutable——可以用它來指出,即使結構(或類)變量為const,其某個成員也可以被修改

 

6. 棧區的詳細說明。

   由於自動變量的數目隨函數的開始和結束而增減,因此程序必須在運行時對自動變量進行管理。常用的方法是留出一段內存,並將其視為棧。程序使用兩個指針來跟蹤棧,一個指針指向棧底,另一個指針指向棧頂(下一個可用的內存單元)。當函數被調用時,將自動變量加入到棧中,棧頂指針指向變量后面的下一個可用的內存單元。函數結束時,棧頂指針被重置為函數被調用前的值,從而釋放新變量使用的內存。

 

7. 我之前的一個小小的疑惑

  局部變量全部都是存儲在棧區的,但是malloc分配的內存在堆區,那么int *p = new int[5];這種應該分配在棧區還是堆區呢?當然是p在棧區,存一個地址,地址對應的地方在堆區。


免責聲明!

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



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