我在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
。
我没有强大的编译器经验,所以我不知道这个结论是否真的有意义。有人可以对此有所了解吗?
谢谢。
答案 0 :(得分:13)
编译器可以确定this
是否实际解除引用(即使用特定的CPU详细信息,而不是一般的C ++规则)。如果方法实际上没有取消引用this
,则不需要提供物理表示。
[编辑]
在评论中,jww提到了另一个案例。单例只有一个副本,因此智能编译器可以将其成员视为全局变量。这意味着singleton->foo
的地址只是常量&singleton + offset(foo)
。作为此优化的结果,单例方法不需要实际取消引用this
来访问单例成员,因此可以再次优化它。