問題タブ [make-shared]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 抽象クラスの unique_ptr からの shared_ptr
Herb Sutter の C++ ガイドラインに従おうとしています。この場合は、unique_ptr生のポインターとshared_ptr. を支持する議論の 1 つは、ある時点で必要になった場合のstd::unique_ptr変換可能性です。shared_ptr
私の場合、vectorofunique_ptrを取るメソッドに渡す必要があるvectorof がありshared_ptrます。私は次のようなものを書くことができることを望んでいました:
これにより、Xcode 7.1ベースのツールチェーンが構成されていると、次のエラーが発生しC++11ます。
エラー: フィールド タイプ 'Abstract' は抽象クラスです。
Abstractを使用すると、STL が型の具体的なインスタンスを保持しようとしているようmake_sharedです。そのため、多くの場合、Sutter 氏のアドバイスは役に立たないように思われるので、何か間違ったことをしているに違いないと確信しています。私は書くことに頼りました:
これを行うより良い方法はありますか?
c++11 - std::make_shared と std::forward — ポイントは何ですか?
std::make_shared が宣言/実装されている理由を理解しようとしています:
私が興味があるのは:
make_sharedが右辺値参照のみを受け入れるのはなぜですか? 定数への参照 (つまりconst _Args &) のオーバーロードがないのはなぜですか?_VSTD::forward電話のポイントは何ですか?
適切な説明または適切なハイパーリンクは、どちらも高く評価されます。
c++ - テンプレート化されたコンストラクターで make_shared または make_unique を呼び出す方法
テンプレート化されたコンストラクターを持つクラスで、make_sharedまたはを呼び出すにはどうすればよいですか? make_unique次に例を示します。
make_shared<A<T>>()これは、テンプレート化されたコンストラクターではなく、テンプレート化されたクラス用であるため、意味がありません (コンパイルもしません)。
make_shared<A><T>()コンパイルもmake_shared<A>(<T>())コンパイルもせず、本来あるべきようにも見えません。同上make_shared<A, T>()
への呼び出しでコンストラクター呼び出しのテンプレートを指定する方法はありますmake_sharedか? 答えはmake_unique;に当てはまると思います。そうでない場合は、それを示してください。ありがとう!
(テンプレートがどのように機能するかを明確にするために、コードを編集しました。)
c++ - dynamic_pointer_cast の予期しない動作
unique_ptr私は、 aを aに返す必要があるファクトリ クラスを構築していBaseClassます。返されたポインターは、次のDerivedClassように使用して共有ポインターmake_sharedに変換された後、目的のBaseClassポインターに変換されるオブジェクトで構成されます。
このコンパイラエラーが発生していますstd::move
私はVS2012を使用しています...
std::unique_ptr<BaseClass>宣言された ( )とは異なるものを使用しているのはなぜですか?
retdynamic_pointer_castに a を返していませんか?std::unique_ptr<BaseClass>
何が起こっているのかを知るために助けてください。
c++ - 私のテストでは、make_shared (boost または stl) は shared_ptr+new よりもわずかに遅いようです
make_shared のパフォーマンス (boost または stl) について私が理解していることについて少し疑問があるので、意見を求めました。
C++ でアプリを作成する際にいくつかのパフォーマンス テストを行う必要があり、最終的に make_shared と shared_ptr+new を比較しました (これはパフォーマンス向上の目的ではないことに注意してください。ここで時間を稼ぐことは期待していませんが、ちょうど今興味がある)
私が使う
- Debian ジェシー x64
- リブースト1.55
- gcc 4.9.2
私は make_shared がより効率的であることを読みました、そして私が見つけることができる説明 (割り当て数、オーバーヘッド) によると、それは私にとって論理的なようです (私が理解できる限り)。
しかし、すばやく愚かなテストを行うと、何が得られるのかわかりません
MyUselessClass は、3 つのクラス属性 (sting、bool、int)、およびコンストラクターとデストラクターのみを持つ単純なクラスです。
「結果」(もちろん正確なテストではないので引用します)は次のとおりです(多くの反復を取得するためにループに実行し、平均して同じ結果が得られます):
私のテストを信じるなら、make_shared は、share_ptr と新しいインスタンス化を呼び出すよりもわずかに遅くなります。違いをナノ秒の精度で見るとしたら、逆に...
だから今私は疑問に思っています:
- 多分私のテストはあまりにも愚かです.ナノ秒の順序はそれらの操作では重要ではありませんか?
- make_shared のパフォーマンスが向上するという説明のポイントを見逃したのではないでしょうか?
- 多分私はテストでいくつかの(いくつかの)ポイントを逃しましたか?
以下の点についていくつかの答えがある場合は、躊躇しないでください:)
ありがとう
c++ - enable_shared_from_this と make_shared は同じ最適化を提供しますか?
私が理解しているようにmake_shared<T>(...)、メモリ割り当ての最適化を提供する場合があります(クラスTのインスタンスと同じメモリブロック内に参照カウンターを割り当てる場合があります)。
enable_shared_from_this は同じ最適化を提供しますか? そう:
以下と同じです:
sizeof(T) を考慮しない場合。