私はGDBのいくつかのC++コードをデバッグしていましたが、いくつかの呼び出しがいわゆる "合成ポインタ"を使用していることがわかりました。周りをグーグルで回っても意味のある結果は得られませんでした。ここでの検索では、タイトルに "synthetic"が付いているほとんどの質問は、Javaの一部の機能を参照しています(この文脈では、 "合成"は "人為的にコンパイラによって生成されたもの"を意味します)。合成ポインタとは何ですか?
例えば、このバックトレースを見て、一回の操作から取った、1人のクラスメンバー上、MyClass
のコンストラクタで行う(このコードは、-O2
とコンパイルされている)m
と呼ば:
#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()
は、どこかで生成されなければならないので、コンパイラはメモリ内のどこにも置かれていない "fake"(合成?)オブジェクトを作成し、ただm
をラップします。
私は強力なコンパイラの経験がないので、この結論が本当に意味をなさないかわかりません。誰かがこれにいくつかの光を当ててくださいか?
ありがとうございます。
はい、私の「MyClass」オブジェクトは構築され、参照されず、後で破壊されました。唯一の重要な操作は、コンストラクタ/デストラクタの副作用でした(レコードの場合は、スコープロックのカスタム実装です)。これは事実であるに違いありません。ありがとうございました。 –
これは合成ポインターが実際に(「これ」が最適化されているとき)何ですか?私は、この答えは、オブジェクトが最適化される "this"のケースである "合成ポインター"ではなく、参照されていない場合に最適化されることが可能であるというサイドノートとして解釈できると感じています。私はスタックトレースの合成ポインタを見るので、それを通常のメッセージではないと解釈する方法がわかりません。 –
@JoeyCarson:それはすべて哲学的です。正式には、オブジェクトは存在するか存在しません。オプティマイザが実行された後、オブザーバビリティプログラムに必要な程度にオブジェクトが部分的に存在する可能性があります。実際のオブジェクトを偽造するのはデバッガに任されています。それは科学ではありません。 – MSalters