8

私がこれを尋ねるのは、多くの明らかな理由から衰弱させる制限だからですが、C++ 標準の連中にはそれを行う正当な理由があると確信しており、それが何であるかを知りたいです。違いが生じるからではなく、それには正当な理由があることを知って気分が良くなるからです.

これが私の現在の見解です。私が見ているように、弱いポインターには2つの主な用途があります。

1) 所有権のループを避けるため。2) 多数の共有ポインターのバウンスに関連するオーバーヘッドを削減するため。

weak_ptr.get() を実装することで、前者はそれほど役に立たず、後者はよりよく機能するので、なぜそれが存在しないのでしょうか? もっと言えば、weak_ptr.get() は weak_ptr.lock().get() よりも効率的ではないでしょうか、それともコンパイラはこれを同じになるように最適化できますか?

4

3 に答える 3

10

ウィーク ポインターは、それが参照するスマート ポインターがまだ有効かどうかを確認できる必要があります。それができない場合は、get実際に使用するまでに結果が有効かどうかを知ることができません。

だからあるのlockです; これにより、必要な限り有効なスマート ポインターが提供されます (これはそれほど長くはないと予想されます)。

直接アクセスしたい場合、本当に必要なのは通常の「ダム」ポインターです。

于 2013-06-23T23:47:03.740 に答える
1

1) 所有権のループを避けるため。2) 多数の共有ポインタのバウンスに関連するオーバーヘッドを削減するため

weak_ptr.get() を実装することで、前者はそれほど役に立たず、後者はよりよく機能するので、なぜそれが存在しないのでしょうか? もっと言えば、weak_ptr.get() は weak_ptr.lock().get() よりも効率的ではないでしょうか、それともコンパイラはこれを同じになるように最適化できますか?

前者は正しく、後者は間違っています - 弱いポインターは魔法のように低コストの共有ポインターではありません...それらは機能的に異なります。あなたの状況に合ったものを選ぶ必要があります。

ウィーク ポインターを使用する主な理由は、データがまだぶらぶらしている場合に使用したいが、なくても問題なく生き残ることができるデータを追跡することです。その確立には、共有ポインターのユーザーとの競合状態が含まれます。そのため、オブジェクトが破棄される前にコードが完了できることを確認できることを意味する、オブジェクトの有効期間に関するインサイダーの洞察がない限り、生のポインターは役に立ちません。インサイダーの洞察がある場合は、最初に生のポインターを取得できます-代わりにしかし、ウィーク ポインターの設計は、誤ってウィーク ポインターを取得して安全でないコードを作成することを防ぐことを目的としています。実際、そのような洞察は、コードの中長期的な進化に直面すると脆弱になる可能性があるため、絶対に必要でない限り、そのような最適化を試みない方がよいでしょう。

おそらく、弱いポインターの適切な使用例が役立つでしょう...

オブジェクトが画面上の何かを表しているとします。それを点滅させたい場合は、タイマー駆動のフラッシャー リストにウィーク ポインターを追加すると、それを忘れることができます。タイマーが次に起動するとき、フラッシャー コードがそのオブジェクトが事前に破棄されていることを検出した場合 (つまり、画面に表示されなくなった場合)、フラッシャーはそのオブジェクトだけをリストから削除しますが、所有権を共有したり、オブジェクトを不自然に保持したりしたくありません。これは、オブジェクトが画面から消えたときにコードを追跡して、フラッシャー リストから引き離さなければならない (そして、そうするためにロックの待機をブロックする可能性がある) よりも簡単かもしれません。

于 2013-06-24T01:22:09.410 に答える
0

これは、shared_ptr/weak_ptr ペアの設計者が、私たち自身を救い、最適化を犠牲にして間違って使用できないようにする方がよいと判断したためです。スレッドの安全性と所有権のセマンティクスを同じにする必要はないかもしれません.nullを知っている素敵なスマートポインタを持つことは有益ですが、ロックのオーバーヘッドは.衰弱させることはありませんが、間違いなく悲観的です。

shared_ptr/weak_ptr がこれを許可するかどうか (notad_ptr where notad - null をターゲットの破棄に追加するが、必ずしもスレッドセーフではない) を許可するか、これを新しいタイプの shared_ptr にするかは議論の余地があります。

これらのセマンティクスをサポートする新しいタイプのスマート ポインターを追加することで、コード ベースでこれを解決します。ただし、標準に準拠していないスマート ポインターを使用することは間違いなく面倒なので、これは最適ではありませんが、追加の有用なセマンティクスは、完全な標準化委員会ほどスマートではない [しゃれが意図されている!] という事実を補う以上のものです:- )

于 2013-06-24T08:47:17.127 に答える