GDBでいくつかのC++コードをデバッグしていたところ、いくつかの呼び出しがいわゆる「合成ポインター」を使用していることがわかりました。グーグルで回っても意味のある結果は得られませんでした。ここでSOを検索すると、タイトルに「synthetic」が含まれているほとんどの質問は、Java機能を参照しています(このコンテキストでは、「synthetic」は「コンパイラによって人工的に生成されたもの」を意味する可能性があると私に示唆している場合でも)。
たとえば、このバックトレースを見てください。1つの操作から取得され、のコンストラクターで実行され、MyClass
1つのクラスメンバーが呼び出され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
。
私はコンパイラの経験が豊富ではないので、この結論が本当に意味があるかどうかはわかりません。誰かがこれに光を当ててくれませんか?
ありがとうございました。