問題タブ [unique-ptr]
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 のパフォーマンスについて
unique_ptr はコピー不可で移動セマンティクスがあるため、ほとんどの状況で shared_ptr よりも unique_ptr が好まれるとよく読みます。shared_ptr は、コピーと参照カウントによるオーバーヘッドを追加します。
しかし、いくつかの状況でunique_ptrをテストすると、対応するものよりも(アクセスが)著しく遅いようです
たとえば、gcc 4.5では次のようになります。
edit : print メソッドは実際には何も印刷しません
平均して (g++ -O0) を取得します。
- shared_ptr : 1480 マイクロ秒
- unique_ptr : 3350 マイクロ秒
違いはどこから来るのですか?それは説明可能ですか?
c++ - boost::scoped_ptrの違いおよびstd::unique_ptr
boost::scoped_ptr<T>
との間の唯一の違いは、移動セマンティクスstd::unique_ptr<T>
を持っているのに対し、単なるget / resetスマートポインターですか?std::unique_ptr<T>
boost::scoped_ptr<T>
c++ - unique_ptrをラムダ式にキャプチャする方法は?
私は以下を試しました:
しかし、それはコンパイルされません。何か案は?
アップデート:
提案されているように、所有権をラムダに譲渡する必要があることを明示的に指定するには、いくつかの新しい構文が必要です。現在、次の構文について考えています。
それは良い候補になるでしょうか?
更新1:
次のように、の実装を示しmove
ますcopy
。
c++ - unique_ptrのコンテナを反復処理します
コンテナから所有権を奪うことなく、(イテレータを介して)コンテナのunique_ptr要素にアクセスするにはどうすればよいですか?コンテナ内の要素へのイテレータを取得するとき、要素の所有権はまだコンテナにありますか?反復子を逆参照してunique_ptrにアクセスする場合はどうでしょうか。それはunique_ptrの暗黙の移動を実行しますか?
コンテナが概念的に要素を所有していて、他のコードが単にコンテナ内の要素を操作したい場合でも、(値ではなく)コンテナに要素を格納する必要がある場合は、shared_ptrを頻繁に使用しています。コンテナから所有権を取得せずに、コンテナ内のunique_ptr要素に実際にアクセスすることはできません。
洞察はありますか?
c++ - std::unique_ptr のカスタム デリータはどのように機能しますか?
N3290 によると、std::unique_ptr
コンストラクターで deleter 引数を受け入れます。
ただし、Windows の Visual C++ 10.0 または MinGW g++ 4.4.1 でも、Ubuntu の g++ 4.6.1 でも動作しません。
したがって、それについての私の理解が不完全または間違っているのではないかと恐れています。明らかに無視されているdeleter引数のポイントがわからないので、誰かが実際の例を提供できますか?
できれば、それがどのように機能するかについても確認したいと思いunique_ptr<Base> p = unique_ptr<Derived>( new Derived )
ます。
おそらく、例をバックアップするために標準からのいくつかの文言を使用して、つまり、使用しているコンパイラが何であれ、実際に行うべきことを実行するということですか?
c++ - std::unique_ptrは基になるオブジェクトの2倍の大きさ
std :: unique_ptrs(特にMSFT VS 10.0の実装)に問題があります。それらのstd::listを作成するとき、基礎となるオブジェクトだけのstd :: listを作成するときの2倍のメモリを使用します(注:これは大きなオブジェクトです-〜200バイトなので、単なる周りにある追加の参照カウンター)。
言い換えれば、私が実行した場合:
私のアプリケーションは、実行時の半分のメモリを必要とします。
MSFTの実装を確認しましたが、明らかなものは何もありません。誰かがこれに遭遇し、何かアイデアがありますか?
編集: わかりました、もう少し明確/具体的にします。これは明らかにWindowsのメモリ使用量の問題であり、明らかに何かが欠けています。私は今、次のことを試しました:
std::list
100000MyObjのを作成しますstd::list
100000MyObj*のを作成しますstd::list
100000int*のを作成しますstd::list
50000int*のを作成します
いずれの場合も、リストの各追加メンバーは、ポインターであろうとなかろうと、アプリケーションを4400(!)バイト膨らませています。これはリリースの64ビットビルドであり、デバッグ情報は含まれていません([リンカー]>[デバッグ]>[デバッグ情報の生成]が[いいえ]に設定されています)。
明らかに、これをもう少し調査して、より小さなテストケースに絞り込む必要があります。
興味のある方のために、ProcessExplorerを使用してアプリケーションのサイズを決定しています。
それは完全にヒープの断片化であったことが判明しました。なんてばかげている。8バイトのオブジェクトあたり4400バイト!事前割り当てに切り替えたところ、問題は完全に解消されました。オブジェクトごとの割り当てに依存することの非効率性に慣れていますが、これはばかげたことです。
以下のMyObjの実装:
c++ - unique_ptrsの配列を渡す正しい方法は何ですか?
コピーが必要ない場合、これはunique_ptrsの配列を渡す正しい方法ですか?
言い換えれば、xに発生するすべてのことが発信者のarrに影響を与えるようにしたいのです。
c++ - C++ パラメーターとして unique_ptrs のベクトルを別の等しい長さのベクトルの対応する要素に渡します (特に並列に)
私は持っている:
unique_ptr
ObjectAの s のベクトルObjectB の新しく構築されたデフォルトのベクトルのベクトル、および
signature を持つオブジェクト B の関数
void f(unique_ptr<ObjectA> o)
。
(以降、Object という単語は省略します)
Bvec[i].f(Avec[i])
すべて0 < i < length
を並行して行うにはどうすればよいですか?
を使用してみtransform(Bvec.begin(), Bvec.end(), A.begin(), B.begin(), mem_fun_ref(&B::f))
ましたが、多くのエラーが発生し、正しい A をパラメーターとして渡すかどうか、ましてやそれらを移動できるかどうかわかりません。 (&B::f(A.begin())
最後のパラメーターとしても機能しません。
for_each を使用してからラムダ関数を使用することも考えましたが、対応する要素を取得する方法がわかりません。カウンターをインクリメントすることを考えましたが、うまく並列化できないと思います (間違っている可能性があります)。
もちろん、0 から最後まで for ループを使用することはできますが、欠けている単純なものがあると確信しており、単純な for ループとは並列ではありません。
ありがとう。
c++ - unique_ptr C++03 エミュレーションの move 関数
unique_ptr の C++03 エミュレーションがどのように実装されているかを理解しようとしています。unique_ptr は std::auto_ptr に非常に似ていますが、より安全です。auto_ptr が所有権を暗黙的に (つまり、黙って) 譲渡した場合、コンパイラ エラーを吐き出します。たとえば、単純な割り当て。関数move
は、エミュレートされた unique_ptr の安全性の背後にある鍵です。
質問:
- 移動機能が 3 つあるのはなぜですか?
参照を受け取り、それを右辺値に変換する 3 番目の move 関数は、次のように実装 (簡略化) されています。
/li>
上記のコードでは、T への明示的な変換は不必要に思えます。実際、Visual Studio 2010 は T への明示的な変換がなくても問題ありません。
ただし、g++、clang、Comeau は 2 番目のバージョンが好きではありません。unique_ptr<T>
これらのコンパイラは、パラメーターとして取るコンストラクターがないと文句を言いdetail_unique_ptr::rv<T>
ます。何故ですか?unique_ptr は、パラメーターとして受け取る (非明示的な) コンストラクターを既に定義してdetail_unique_ptr::rv<T>
います。それが自動的に取得されないのはなぜですか?
c++ - この場合、unique_ptr の動作はどうあるべきですか?
私は次のものを持っているとしましょう:
この複雑な例では、 の動作はどうあるべきpA(new A);
でしょうか?
私が知る限り、MSVC2010 では、void operator()(T*) const;
from default_delete が返された直後に呼び出されnew
、ポインターをすぐに削除します。g++(4.7.0) ではno match for call (std::unique_ptr<A>)(A*)
エラーが発生しました。