如何查看編譯器在C++中添加的代碼?如何查看編譯器添加的代碼?
例如,我們知道 當某個類的對象超出了作用域時,該對象的析構函數被調用,但是如何查看執行析構函數調用的特定代碼?該代碼仍然是用C++編寫的嗎?
如何查看編譯器在C++中添加的代碼?如何查看編譯器添加的代碼?
例如,我們知道 當某個類的對象超出了作用域時,該對象的析構函數被調用,但是如何查看執行析構函數調用的特定代碼?該代碼仍然是用C++編寫的嗎?
沒有必要添加任何「代碼」。 C++在發生這種情況時非常清楚,對於編譯器來說,明確地創建一個新對象意味着調用它的構造函數 - 在任何地方都不需要額外的「代碼」。
然而,你說的對構造函數或析構函數的調用必須在程序集的某個地方結束 - 但絕對不能保證看看程序集顯示的內容遠遠超過你所知道的內容沒有。 C++編譯器在這些方面非常成熟,並且在有意義的情況下嵌入了許多東西,使得相同的代碼在不同的地方看起來不同。
您將得到最接近的是將調試符號添加到您的構建並使用調試器來獲取調用圖 - 這將確保您注意到當您看到代碼被調用時。
它依賴於編譯器和彙編語言。例如,使用Microsoft編譯器,使用/FAsc
進行編譯時,將爲每個包含彙編代碼的目標文件生成一個.cod
文件以及原始C++行作爲註釋。它還會顯示對構造函數/析構函數的調用。
您可以在編譯命令中添加標記,讓您可以在編譯器完成的各個操作階段看到文件。例如,-S
標誌將生成一個文件,該文件可以完成預處理器並完成初始編譯,但在彙編器運行之前。但是,這些代碼不會用C++編寫。
使用gcc,'-fdump-tree-all'會生成一些文件,顯示類似C語法的中間階段。 –