什么是合成指针?

Mar*_*nde 28 c++ gdb pointers

我正在调试GDB中的一些C++代码,我发现有些调用正在使用所谓的"合成指针".谷歌搜索没有产生任何有意义的结果.在这里搜索SO,其标题中"合成"的大多数问题都是指一些Java特性(即使他们建议我"合成",在这种情况下,可能意味着"由编译器人工生成的东西").

例如,看一下这个回溯,从一个操作中获取,在构造函数中执行MyClass,超过一个被调用的类成员m(此代码已经编译-O2):

#0  MyClass (arg=..., this=<synthetic pointer>) at somefile.h:144
144     m->lock();
gdb$ print this
$1 = (MyClass * const) <synthetic pointer>
gdb$ print *this
$2 = <optimized out>
Run Code Online (Sandbox Code Playgroud)

上面的堆栈跟踪清楚地表明这this是一个指向已经优化的对象的指针,但是如何在其上调用方法(即其构造函数)?我的猜测是,即使m在代码中主动使用了封闭的object(),一些优化也让编译器决定封闭的object(this)不是必需的.由于m->lock()无法优化的方法调用必须在某处发出,编译器会创建一个"假的"(合成的?)对象,它位于内存中,只是为了换行m.

我没有强大的编译器经验,所以我不知道这个结论是否真的有意义.有人可以对此有所了解吗?

谢谢.

MSa*_*ers 13

编译器可以确定是否this实际解除引用(即使用特定的CPU详细信息,而不是一般的C++规则).如果方法实际上没有取消引用this,则不需要具有可用的物理表示.

[编辑]在评论中,jww提到了另一个案例.单例只有一个副本,因此智能编译器可以将其成员视为全局变量.这意味着地址singleton->foo只是常数&singleton + offset(foo).作为此优化的结果,单例方法不需要实际取消引用this以访问单例成员,因此可以再次优化它.

  • 这是合成指针实际上是什么(当"这个"被优化出来时)?我觉得这个答案可以解释为一个附注,即如果从未引用过对象可以优化,但不是"合成指针"是"this"被优化的情况.我在堆栈跟踪中看到了合成指针,我不知道如何解释它不是常规的<optimized_out>消息. (2认同)
  • @JoeyCarson:这有点哲学.形式上,对象存在或不存在.优化器运行后,对象可能部分存在,达到可观察行为程序所需的程度.这取决于伪造真实对象的调试器,这不是一门科学. (2认同)