37

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

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

4

1 に答える 1

50

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

いいえ。

参照カウントがオブジェクト自体に隣接してメモリに格納され、参照の局所性とキャッシュの使用率が向上するため、侵入型スマートポインタとほぼ同じくらい効率的なstd::make_shared手段があります(以下の注を参照) 。また、が所有するオブジェクトへの組み込みポインターしかない場合にを取得できるようにしますが、さまざまなスマートポインタータイプを使用してオブジェクトを管理することはできません。std::shared_ptrstd::enable_shared_from_thisstd::shared_ptrshared_ptr

shared_ptrオブジェクトの管理に完全に責任があることを期待しています。別のスマートポインタタイプは、「強い」refcountのみを管理し、「弱い」refcountは管理しない場合があります。これにより、カウントが同期しなくなり、の不変条件が破られshared_ptrます。


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

于 2012-12-17T11:22:13.473 に答える