我在 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
。
我没有很强的编译经验,所以我不知道这个结论是否真的有意义。有人可以对此有所了解吗?
谢谢你。