我正在调试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以访问单例成员,因此可以再次优化它.
| 归档时间: |
|
| 查看次数: |
5150 次 |
| 最近记录: |