28

我在 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>

上面的堆栈跟踪清楚地表明这this是一个指向已优化对象的指针,但怎么可能调用了一个方法(即它的构造函数)呢?我的疯狂猜测是,即使封闭对象 ( m) 在代码中被积极使用,一些优化让编译器决定封闭对象 ( this) 并不是真正必要的。m->lock()由于无法优化的方法调用必须在某处发出,编译器创建一个“假”(合成?)对象,位于内存中的任何位置,只是为了 wrap m

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

谢谢你。

4

1 回答 1

13

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

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

于 2012-08-09T07:38:58.420 回答