对于std :: vector,析构函数被调用两次,优化级别为0

问题描述 投票:-3回答:1

我试图理解使用std::vectoremplace_back (or) push_back及其compiler explorer函数生成的汇编代码。

注意:优化级别为0,即使用-O0

我无法理解的一件事是,为什么有两个析构函数被调用而不是一个(因为你可以看到只创建了一个向量。如果我假设一个临时对象是在内部创建的,那么我必须看到打电话给std::vector构造函数。

这与clang编译器也是一样的。

有人可以解释一下这里发生了什么吗?

编辑1:

#include <vector>
int main()
{
    std::vector<int> vec;
    vec.emplace_back(10);
}

编辑2:删除屏幕截图,因为它很难阅读。

c++ c++11 vector
1个回答
8
投票

第34行有一个线索:call _Unwind_Resume。第28到34行的代码块用于在抛出异常时进行堆栈展开。正常的代码路径在第25行经过析构函数调用,然后在第27行跳过异常代码到第35行,然后从函数返回。

只是为了澄清,这里有魔力:对_Unwind_Resume的调用不会返回给调用者。获取正在执行的块的地址是一个技巧,以便异常处理代码可以找出它的位置并继续堆栈。

© www.soinside.com 2019 - 2024. All rights reserved.