2015-05-05 83 views
0

當聲明不同的方式以及哪種方式最好時,全局變量的存儲位置似乎還不清楚?全局變量的分配C++

例如,每個示例中存儲的變量在哪裏以及它們的範圍是什麼?

//Example 1 (at the top of a cpp file): 
Rectangle rect(15,12); 

//Example 2: 
Rectangle *rect = new Rectangle(15,12); 
+0

ISO C++標準並沒有規定事物的存儲位置,只有事物的行爲除非你有特定的實現要談,否則這個問題是無法回答的。 – paxdiablo

回答

2

「存儲變量在哪裏」通常是錯誤的問題。它在不同平臺之間有所不同,並且該語言旨在提供對這些細節的抽象。

示例1創建一個Rectangle對象,其中靜態存儲時間爲。它通常會在main返回後自動銷燬。

示例2使用動態存儲持續時間創建一個Rectangle對象。只要您在指針上調用delete(或者,可能顯式調用析構函數),它就會被銷燬。否則它不會被銷燬。非正式的人們說動態存儲持續時間的對象是「堆積如山」,但是這種喚起的實現細節具有與平臺相關的含義。

0

當變量「獲取存儲」是實現定義,而不是在C++標準的範圍,除非其範圍的具體語義。

假設這兩個聲明都是靜態作用域的,在這兩種情況下,'rect'都將存儲在靜態作用域中。在第二種情況下,rect將引用堆分配對象,並且在應用程序的整個生命週期中,應用程序可能會指向該指針,並且/或者重新指派它以指向該類的其他實例。

1

如果第一個被定義在函數之外,它將被存儲在DATA段中。如果它在函數中定義,它將被存儲在堆棧中。

第二個(指針本身)是相同的,但指針指向的對象將被分配到堆上。

1

存在過分簡化的風險。 。 。 。

的編譯器將編譯單元分割成幾個部分: - 可執行數據 - 只讀數據 - 讀寫數據 連接器將收集所有具有相同屬性的部分在一起。在鏈接過程結束時,全局讀取/寫入數據通常會與讀取/寫入數據合併。

這創建讀/寫數據。

Rectangle rect(15,12); 

這將創建rect的讀/寫數據以及在啓動時調用new的可執行數據。

Rectangle *rect = new Rectangle(15,12); 

忽略調試信息,局部變量只有在編譯期間纔有作用域。編譯後,局部變量只是[相對]內存位置。編譯後全局變量仍可識別。鏈接後,全局變量基本消失。

(爲了簡單起見,我忽略了通用符號和共享庫。)