web-dev-qa-db-ja.com

c ++ 11のintrusive_ptr

C++ 11にはboost::intrusive_ptrと同等のものはありますか?

私の問題は、C++コードにCスタイルのインターフェースがあることです。インターフェイスの両側でC++を使用できますが、互換性の理由からCインターフェイスを公開する必要があります。 std::shared_ptrを使用できません。2つ(またはそれ以上)のスマートポインターを使用してオブジェクトを管理する必要があるためです。 boost::intrusive_ptrなどの解決策を理解できません。

34
Aarkan

C++ 11にはboost :: intrusive_ptrと同等の機能がありますか?

番号。

_std::make_shared_はあります。つまり、_std::shared_ptr_はほぼ(以下の注を参照)侵入型スマートポインタと同じくらい効率的です。これは、参照カウントがオブジェクトに隣接してメモリに保存されるためです。それ自体、参照の局所性とキャッシュの使用を改善します。また、_std::enable_shared_from_this_を提供します。これにより、_std::shared_ptr_が所有するオブジェクトへの組み込みポインターのみがある場合に_shared_ptr_を取得できますが、さまざまなスマートポインタ型を使用するオブジェクト。

_shared_ptr_は、オブジェクトの管理を完全に担当することを期待しています。別のスマートポインタータイプは、「強い」参照カウントのみを管理し、「弱い」参照カウントは管理しない可能性があります。これにより、カウントが同期しなくなり、_shared_ptr_の不変式が壊れます。


注:_make_shared_を使用すると、_shared_ptr_がほぼになり、侵入ポインタと同じくらい効率的になります。 _make_shared_を使用すると、オブジェクトと参照カウント情報をメモリの単一のチャンクに割り当てることができますが、(「強い」カウントと「弱い」カウントの)2つの参照カウントはまだありません。侵入ポインタは_weak_ptr_をサポートしていないため、大文字の場合です。また、_shared_ptr_オブジェクト自体は常に2つのポインター(shared_ptr::get()によって返されるポインターと、参照カウントを含み動的型を知っている「制御ブロック」への別のポインター)を保存する必要があります所有オブジェクトの)なので、侵入ポインタよりもフットプリントが大きくなります。

42
Jonathan Wakely