當聲明不同的方式以及哪種方式最好時,全局變量的存儲位置似乎還不清楚?全局變量的分配C++
例如,每個示例中存儲的變量在哪裏以及它們的範圍是什麼?
//Example 1 (at the top of a cpp file):
Rectangle rect(15,12);
//Example 2:
Rectangle *rect = new Rectangle(15,12);
當聲明不同的方式以及哪種方式最好時,全局變量的存儲位置似乎還不清楚?全局變量的分配C++
例如,每個示例中存儲的變量在哪裏以及它們的範圍是什麼?
//Example 1 (at the top of a cpp file):
Rectangle rect(15,12);
//Example 2:
Rectangle *rect = new Rectangle(15,12);
「存儲變量在哪裏」通常是錯誤的問題。它在不同平臺之間有所不同,並且該語言旨在提供對這些細節的抽象。
示例1創建一個Rectangle
對象,其中靜態存儲時間爲。它通常會在main
返回後自動銷燬。
示例2使用動態存儲持續時間創建一個Rectangle
對象。只要您在指針上調用delete
(或者,可能顯式調用析構函數),它就會被銷燬。否則它不會被銷燬。非正式的人們說動態存儲持續時間的對象是「堆積如山」,但是這種喚起的實現細節具有與平臺相關的含義。
當變量「獲取存儲」是實現定義,而不是在C++標準的範圍,除非其範圍的具體語義。
假設這兩個聲明都是靜態作用域的,在這兩種情況下,'rect'都將存儲在靜態作用域中。在第二種情況下,rect將引用堆分配對象,並且在應用程序的整個生命週期中,應用程序可能會指向該指針,並且/或者重新指派它以指向該類的其他實例。
如果第一個被定義在函數之外,它將被存儲在DATA段中。如果它在函數中定義,它將被存儲在堆棧中。
第二個(指針本身)是相同的,但指針指向的對象將被分配到堆上。
存在過分簡化的風險。 。 。 。
的編譯器將編譯單元分割成幾個部分: - 可執行數據 - 只讀數據 - 讀寫數據 連接器將收集所有具有相同屬性的部分在一起。在鏈接過程結束時,全局讀取/寫入數據通常會與讀取/寫入數據合併。
這創建讀/寫數據。
Rectangle rect(15,12);
這將創建rect的讀/寫數據以及在啓動時調用new的可執行數據。
Rectangle *rect = new Rectangle(15,12);
忽略調試信息,局部變量只有在編譯期間纔有作用域。編譯後,局部變量只是[相對]內存位置。編譯後全局變量仍可識別。鏈接後,全局變量基本消失。
(爲了簡單起見,我忽略了通用符號和共享庫。)
ISO C++標準並沒有規定事物的存儲位置,只有事物的行爲除非你有特定的實現要談,否則這個問題是無法回答的。 – paxdiablo