gpt4 book ai didi

c++ - 什么是合成指针?

转载 作者:IT老高 更新时间:2023-10-28 12:49:00 30 4
gpt4 key购买 nike

我在 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() 必须在某处发出,因此编译器创建了一个“假”(合成?)对象,它位于内存中的任何位置,只是为了包装m.

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

谢谢。

最佳答案

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

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

关于c++ - 什么是合成指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11878719/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com