簡體   English   中英

堆棧展開背后的機制是什么?

[英]What is the machinery behind stack unwinding?

我試圖了解 C++ 中堆棧展開背后的機制。換句話說,我對如何實現此功能感興趣(以及它是否是標准的一部分)。

因此,線程會執行一些代碼,直到拋出異常。 拋出異常時,用於記錄 state 和展開堆棧的線程/中斷處理程序是什么? 標准保證了什么,具體實現是什么?

線程執行一些代碼,直到拋出異常,並繼續執行 異常處理依然是C++代碼。

throw表達式創建了一個 C++ object,在拋出 function 的上下文中運行。當異常 object 的構造函數運行時,拋出 function 的 scope 中的所有對象仍然存在。

然而,緊接在堆棧展開之后。 C++ 編譯器將安排一條返回路徑,該路徑不需要返回 object,但允許傳遞異常 object。就像正常返回一樣,當 function 返回時,function 的本地對象將被銷毀。 在二進制級別,這非常簡單:它只是一堆析構函數調用,通常還會調整堆棧指針。

該標准也沒有指定的是用於確定需要退出多少范圍的機制。 該標准根據catch進行描述,但典型的 CPU 沒有直接等效項。 因此,這通常是給定平台的 C++ ABI 的一部分,以便共享 ABI 的編譯器同意。 ABI 兼容性要求調用者必須捕獲來自被調用者的異常,即使它們是用不同的編譯器編譯的。 而且很明顯,析構函數是要調用的,所以ABI也需要安排那個機制。 中間函數甚至可以由第三方編譯器編譯——只要它們共享一個 ABI,就應該可以正常工作。

如評論中所述, C++ 沒有中斷的概念。 如果操作系統需要通過中斷發生某些事情,則編譯器需要處理它。 C++ 代碼當時究竟在做什么並不重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM