什么是合成指针?

时间:2012-08-09 07:35:12

标签: c++ pointers gdb

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

例如,查看此backtrace,从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>

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

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

谢谢。

1 个答案:

答案 0 :(得分:13)

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

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