C++ gcc-fdump树的原始输出

C++ gcc-fdump树的原始输出,c++,gcc,g++,internals,C++,Gcc,G++,Internals,如果我转储GCC为虚拟析构函数生成的代码(使用-fdump tree original),我会得到如下结果: ;; Function virtual Foo::~Foo() (null) ;; enabled by -tree-original { <<cleanup_point <<< Unknown tree: expr_stmt (void) (((struct Foo *) this)->_vptr.Foo = &_ZTV3Foo +

如果我转储GCC为虚拟析构函数生成的代码(使用-fdump tree original),我会得到如下结果:

;; Function virtual Foo::~Foo() (null)
;; enabled by -tree-original

{
  <<cleanup_point <<< Unknown tree: expr_stmt
  (void) (((struct Foo *) this)->_vptr.Foo = &_ZTV3Foo + 8) >>>
>>;
}
<D.20148>:;
if ((bool) (__in_chrg & 1))
  {
    <<cleanup_point <<< Unknown tree: expr_stmt
  operator delete ((void *) this) >>>
>>;
  }
;;函数virtual Foo::~Foo()(null)
;; 由原始树启用
{
>>;
}
:;
如果((bool)(uu in_uchrg&1))
{
>;
}

我的问题是:“
:;
”后面的代码在哪里?它在析构函数之外,因此何时执行此代码?

这看起来像是编译器生成的代码,用于在调用析构函数后管理实际内存释放,应该在析构函数代码之后立即执行。

在查看程序集输出后,看起来您是对的。但是你知道为什么代码会显示在析构函数之外,以及标签的含义吗?编译器会向你展示它生成的与你编写的代码相对应的内容。标签后面的代码是自动生成的,实际上是由delete调用而不是析构函数引起的。即使它是在析构函数之后调用的,它也不是析构函数代码的一部分。我不知道这个标签是什么意思。