我试图了解使用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: 由于难以阅读,删除了屏幕截图。
答案 0 :(得分:8)
第34行有一个提示:call _Unwind_Resume
。从第28行到第34行的该代码块用于在引发异常时展开堆栈。正常代码路径在第25行经过destructor调用,然后在第27行跳过异常代码,跳至第35行,然后从那里从函数返回。
仅需说明,这里有个魔术:_Unwind_Resume
的呼叫不会返回到呼叫者。这是一个技巧,获取正在执行的块的地址,以便异常处理代码可以找出其所在位置并继续堆栈。