28

GDBでいくつかのC++コードをデバッグしていたところ、いくつかの呼び出しがいわゆる「合成ポインター」を使用していることがわかりました。グーグルで回っても意味のある結果は得られませんでした。ここでSOを検索すると、タイトルに「synthetic」が含まれているほとんどの質問は、Java機能を参照しています(このコンテキストでは、「synthetic」は「コンパイラによって人工的に生成されたもの」を意味する可能性があると私に示唆している場合でも)。

たとえば、このバックトレースを見てください。1つの操作から取得され、のコンストラクターで実行され、MyClass1つのクラスメンバーが呼び出され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

私はコンパイラの経験が豊富ではないので、この結論が本当に意味があるかどうかはわかりません。誰かがこれに光を当ててくれませんか?

ありがとうございました。

4

1 に答える 1

13

コンパイラthisは、が実際に逆参照されているかどうかを判断できます(つまり、一般的なC ++ルールではなく、特定のCPUの詳細を使用します)。メソッドが実際に逆参照しない場合thisは、物理表現を使用できるようにする必要はありません。

[編集]コメントの中で、jwwは別のケースについて言及しました。シングルトンにはコピーが1つしかないため、スマートコンパイラはそのメンバーをグローバルとして扱うことができます。つまり、のアドレスsingleton->fooは単なる定数&singleton + offset(foo)です。この最適化の結果として、シングルトンメソッドはthis、シングルトンメンバーにアクセスするために実際に逆参照する必要がないため、再度最適化することができます。

于 2012-08-09T07:38:58.420 に答える