我试图理解使用std::vector
为emplace_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:删除屏幕截图,因为它很难阅读。
第34行有一个线索:call _Unwind_Resume
。第28到34行的代码块用于在抛出异常时进行堆栈展开。正常的代码路径在第25行经过析构函数调用,然后在第27行跳过异常代码到第35行,然后从函数返回。
只是为了澄清,这里有魔力:对_Unwind_Resume
的调用不会返回给调用者。获取正在执行的块的地址是一个技巧,以便异常处理代码可以找出它的位置并继续堆栈。