优化级别为0的std :: vector调用了两次析构函数

时间:2018-08-31 12:33:53

标签: c++ c++11 vector

我试图了解使用compiler explorerstd::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:     由于难以阅读,删除了屏幕截图。

1 个答案:

答案 0 :(得分:8)

第34行有一个提示:call _Unwind_Resume。从第28行到第34行的该代码块用于在引发异常时展开堆栈。正常代码路径在第25行经过destructor调用,然后在第27行跳过异常代码,跳至第35行,然后从那里从函数返回。

仅需说明,这里有个魔术:_Unwind_Resume的呼叫不会返回到呼叫者。这是一个技巧,获取正在执行的块的地址,以便异常处理代码可以找出其所在位置并继续堆栈。