1) 所有権のループを避けるため。2) 多数の共有ポインタのバウンスに関連するオーバーヘッドを削減するため
weak_ptr.get() を実装することで、前者はそれほど役に立たず、後者はよりよく機能するので、なぜそれが存在しないのでしょうか? もっと言えば、weak_ptr.get() は weak_ptr.lock().get() よりも効率的ではないでしょうか、それともコンパイラはこれを同じになるように最適化できますか?
前者は正しく、後者は間違っています - 弱いポインターは魔法のように低コストの共有ポインターではありません...それらは機能的に異なります。あなたの状況に合ったものを選ぶ必要があります。
ウィーク ポインターを使用する主な理由は、データがまだぶらぶらしている場合に使用したいが、なくても問題なく生き残ることができるデータを追跡することです。その確立には、共有ポインターのユーザーとの競合状態が含まれます。そのため、オブジェクトが破棄される前にコードが完了できることを確認できることを意味する、オブジェクトの有効期間に関するインサイダーの洞察がない限り、生のポインターは役に立ちません。インサイダーの洞察がある場合は、最初に生のポインターを取得できます-代わりにしかし、ウィーク ポインターの設計は、誤ってウィーク ポインターを取得して安全でないコードを作成することを防ぐことを目的としています。実際、そのような洞察は、コードの中長期的な進化に直面すると脆弱になる可能性があるため、絶対に必要でない限り、そのような最適化を試みない方がよいでしょう。
おそらく、弱いポインターの適切な使用例が役立つでしょう...
オブジェクトが画面上の何かを表しているとします。それを点滅させたい場合は、タイマー駆動のフラッシャー リストにウィーク ポインターを追加すると、それを忘れることができます。タイマーが次に起動するとき、フラッシャー コードがそのオブジェクトが事前に破棄されていることを検出した場合 (つまり、画面に表示されなくなった場合)、フラッシャーはそのオブジェクトだけをリストから削除しますが、所有権を共有したり、オブジェクトを不自然に保持したりしたくありません。これは、オブジェクトが画面から消えたときにコードを追跡して、フラッシャー リストから引き離さなければならない (そして、そうするためにロックの待機をブロックする可能性がある) よりも簡単かもしれません。