[英]destructor is called twice for std::vector with optimization level 0
我正在嘗試使用compiler explorer理解為std::vector
及其emplace_back (or) push_back
函數生成的匯編代碼。
注意:優化級別為 0,即使用 -O0
我無法理解的一件事是,為什么要調用兩個析構函數而不是一個析構函數(如您所見,只創建了一個向量。如果我假設在內部創建了一個臨時對象,那么至少我必須看到對std::vector
構造函數的調用。
這與 clang 編譯器相同。
有人可以解釋一下這里發生了什么嗎?
編輯1:
#include <vector>
int main()
{
std::vector<int> vec;
vec.emplace_back(10);
}
編輯 2:刪除了屏幕截圖,因為它很難閱讀。
第 34 行有一條線索: call _Unwind_Resume
。 該代碼塊,從第 28 行到第 34 行,用於在拋出異常時進行堆棧展開。 正常的代碼路徑通過第 25 行的析構函數調用,然后在第 27 行跳過異常代碼,跳轉到第 35 行,然后從函數返回。
澄清一下,這里有一個神奇之處:對_Unwind_Resume
的調用不會返回給調用者。 這是一個技巧,獲取正在執行的塊的地址,以便異常處理代碼可以確定它在哪里並繼續向上堆棧。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.