[解決済み] std::shared_ptr に相当する非アトミックなものはあるのでしょうか?また、なぜ <memory> にはないのでしょうか?
質問
これは少し2つの部分に分かれた質問で、すべて
std::shared_ptr
:
1.
私が知る限りでは
std::shared_ptr
の中で唯一のスマートポインタです。
<memory>
の中で唯一アトミックなものです。アトミックでないバージョンの
std::shared_ptr
が利用可能かどうか(私は
<memory>
にあるような、標準外の提案も歓迎です)。私が知っているのは
boost::shared_ptr
はアトミックでもあります(もし
BOOST_SP_DISABLE_THREADS
が定義されていない場合)、しかし、多分他の代替手段があるのでは?と同じセマンティクスを持つものを探しています。
std::shared_ptr
と同じセマンティクスを持つが、原子性はないものを探しています。
2.
なぜかわかる
std::shared_ptr
がアトミックである理由は理解できます。しかし、それはすべての状況にとって良いことではなく、C++ は歴史的に「使った分だけ支払う」というマントラを持っています。複数のスレッドを使用していない場合、または複数のスレッドを使用しているがスレッド間でポインタの所有権を共有していない場合、原子スマート ポインタは過剰なものです。2 つ目の質問は
の非アトミックバージョンがなかったのはなぜですか?
std::shared_ptr
は C++11 で提供されなかったのでしょうか。
? (があると仮定して)。
なぜ
) (その答えが単に "非原子バージョンは単に考慮されなかった" または "誰も非原子バージョンを要求しなかった" であれば、それはそれで結構です!) 。
質問 2 では、誰かが
shared_ptr
(の原子版を置き換えるためではなく)(Boost または標準化委員会に対して)。
shared_ptr
を置き換えるのではなく、それと共存するため)、そしてそれは特定の理由のために撃墜されました。
どのように解決するのですか?
<ブロッククオート1. 私はstd::shared_ptrの非アトミックバージョンが利用可能であるかどうかを疑問に思っている
標準では提供されていません。 サードパーティのライブラリによって提供されているものがあるかもしれません。 実際、C++11 より前、および Boost より前は、誰もが独自の参照カウントされたスマート ポインターを書いていたように思います (私を含めて)。
2. 私の 2 番目の質問は、なぜ std::shared_ptr の非アトミック バージョンが C++11 で提供されなかったのでしょうか?
この質問は、2010 年の Rapperswil 会議で議論されました。 このテーマは、スイスの国別団体コメント #20 によって導入されました。 あなたが質問で提供したものを含め、議論の両側で強い主張がありました。 しかし、議論の最後には、非同期化 (非アトミック) 版の
shared_ptr
.
反対意見も含む。
-
非同期shared_ptrで書かれたコードは、将来スレッド化されたコードで使用され、警告もなくデバッグが困難な問題を引き起こしてしまうかもしれません。
-
参照カウントでトラフィックするための 1 つの "universal" shared_ptr を持つことは、利点があります。 以下から 元の提案 :
使用する機能に関係なく同じオブジェクトタイプを持つため、サードパーティライブラリを含むライブラリ間の相互運用が非常に容易になる。
-
アトミックのコストは、ゼロではありませんが、圧倒的なものではありません。 このコストは、アトミック操作を使用する必要がない移動構築と移動割り当てを使用することで軽減されます。 このような操作は、一般的に
vector<shared_ptr<T>>
erase と insert でよく使用されます。 -
本当にそうしたいのであれば、人々が独自の非原子参照カウントのスマートポインタを書くことを禁止するものはありません。
その日、RapperswilにあるLWGからの最後の言葉はこうでした。
CH20を拒否する。現時点では変更を行うためのコンセンサスはない。
関連
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] 8192個の要素にループをかけると、プログラムが遅くなるのはなぜですか?
-
[解決済み] なぜstd::shared_ptrをstd::moveしなければならないのでしょうか?
-
[解決済み] std::shared_ptr<void>はなぜ動くのか?
-
[解決済み] shared_ptrはどこですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】C++の余分な資格エラー
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】Swiftの配列の代入が矛盾している(参照でも深層コピーでもない)理由はあるのか?)
-
[解決済み] num++は'int num'のアトミックになり得るか?