問題タブ [copy-and-swap]

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.

0 投票する
3 に答える
322 参照

c++ - スワップメンバーの実装をスローしても問題ありませんか?

(copy-and-swap イディオムを使用して) クラスを作成するときの一般的なガイドラインは、スローしないスワップ メンバー関数を提供することです。( Effective C++、第 3 版、項目 25およびその他のリソース)

ただし、クラスがスワップ操作を提供しないサードパーティ クラス メンバーを使用しているために、nothrow 保証を提供できない場合はどうなりますか?

CString スワップを非スローにすることはできないため、スワップが失敗する可能性は低いです。

注: まれなサード パーティ クラスでは、スマート ptr (pimpl) を使用することもできますが、 -

注: CString は良い例です。彼の正気 (?) の誰も、pimpl (smart ptr) を介して CString のような概念的に単純でユビキタスなクラスのすべてのメンバーを保持し始めることはありません。 CString を変更して完全にノースロー スワップを許可する (短期から中期) チャンスはありません。

それで、あなたがそれを助けることができないなら、スワップメンバー関数をスローする可能性があっても大丈夫ですか? (または、この難問を回避する方法を知っていますか?)

編集:そして:強力な保証ではない場合、基本的な保証を提供するために、スロースワップメンバーをコピーアンドスワップイディオムで使用できますか?

0 投票する
1 に答える
785 参照

c++ - 抽象クラスへの参照を持つクラスのコピー アンド スワップ イディオム

クラスにCopy-and-Swap Idiomを実装しようとしてoperator=います.

しかし今、ビルドエラーが発生しています:

それは私をここに指摘します:

これはイディオムの Swap 関数であり、m_Variables実際には抽象クラスへの参照です。そのような参照を交換することは不可能ですか? 最近使い始めたのでBoostの解決策があれば教えてください。

0 投票する
2 に答える
1781 参照

c++ - 可変長レコード用の C++ のロックフリー共有メモリ

私はIPCの初心者です。Writer プロセスは共有メモリにデータを書き込み、多くの Reader プロセスがデータを読み取ります。書き込まれるデータには一意の識別子があり、アクセスを高速化するために一意のキーでインデックスを作成する必要があります (ルックアップ用の STL::map または hashmap など)。また、データは可変長レコード ( XML ) です (平均長は 200 ~ 250 バイト)。OS は Intel Xeon Quad Core Server 上の solaris 10 (i86pc) です。

合計データサイズは 200G 以上です。ただし、共有メモリには最新のデータのみを保持します。履歴データはファイルにあります。共有メモリのサイズは約 4G~6G です。

Boost::interprocess のような利用可能な外部ライブラリはありません

いくつか質問があります。

  1. どちらがより効率的ですか:shared_memoryまたはmmap(メモリマップファイル)
  2. 可変長レコードのインデックスを作成する方法。[わかりません。ハッシングがあるのでしょうか?].
  3. XML が固定サイズの構造に変換された場合、これはうまくいくでしょうか (トレードオフ - 構造のサイズは巨大になり、300 以上のフィールドが可能になります)。
  4. カスタム アロケータを提供することで、任意の STL を shared_memory に配置できますか?
  5. セマフォなしで実装することは可能ですか ( CAS を使用したロックレス実装)。

ありがとう

これはどう。

新しいデータが到着し、セグメントがいっぱいになったとき。最も古いデータが循環的に消去されます。複数のレコードを消去する必要がある可能性があります。

0 投票する
2 に答える
321 参照

c++ - インターフェイスを介して行われるコピーアンドスワップ

私はコピー+スワップのイディオムを実装して、抽象化のレベルを通じて強力な例外の安全性を実現しようとしています。原則は明らかですが、悪魔は詳細にあることがよくあります。

次のようなクラスがあるとします。

ISomethingのみを処理するメソッド内でこれを実行できるようになりました。

どこ

すべてのdynamic_castが参照上にあるため、これはすべて機能します。これは、タイプがサポートされていない場合にスローされる操作です。スワップは最後まで行われないため、これによりオブジェクトは良好な状態になります。しかし、私が気に入らないのは、swappable1.Swap(swappable2)の呼び出しが(同じdynamic_castメカニズムを介して)スローできるという事実です。これは、Swapのユーザーにとって、おそらく何も期待しないため、直感に反します。その時点で投げる。

私が考えた別の方法は、Swapの実装内のdynamic_castを廃止するためにISwappableをテンプレート化することでした。

そのため、その実装は単純です

これにより、Swap呼び出しを非スローにすることができます(また、コンパイル時に2つのオブジェクトが実際にスワップ可能であることを保証できます)が、問題は、DoSomething内で具象型を処理する必要があることですが、その関数内のAConcreteTypeにアクセスできます。

何か案は?

0 投票する
4 に答える
3296 参照

c++ - C ++テンプレートクラスにswap()を提供すると、std :: swap()が壊れますか?

カスタムMatrixクラスにコピーアンドスワップイディオムを実装しようとしていたところ、リンク先の質問で提案されている方法でswap()の実装に問題が発生しました。

(私が使用したコンパイラはMS VS2010 IDEのものであり、方言は古き良きC ++ 03です。)

この名前空間にある関数のコードで通常のstd::swap()に到達するのに問題があります。

残念ながら、何らかの理由でmy_space::swap()、Matrixは他のすべての呼び出しをエイリアスしているようstd::swap()です。引数が適合せず、ADLが優先する必要があるため、理由がわかりませんstd::swap

(エラーは、使用しようとしているすべての行で10回繰り返されますstd::swap

引数が合わない場合でも、my_space::swap()常にで却下std::swap()しますか?my_space表示されていないわけではなく、作成std::swap()my_space::swap()は問題なく動作していました。

0 投票する
2 に答える
2502 参照

c++ - 仮想継承でイディオムを交換およびコピーするための適切なアプローチは何ですか?

古典的な仮想継承のダイアモンド階層を考えてみましょう。そのような階層でのコピーとスワップのイディオムの正しい実装は何であるかを知りたいと思います。

このは、A、B、Dクラスのデフォルトのコピーセマンティクスでうまく機能するため、少し人工的であり、あまりスマートではありません。ただし、問題を説明するためだけに、弱点の例を忘れて解決策を提供してください。

したがって、2つの基本クラス(B <1>、B <2>)から派生したクラスDがあります。各Bクラスは、実質的にAクラスから継承します。各クラスには、コピーとスワップのイディオムを使用した、自明ではないコピーセマンティクスがあります。最も派生したDクラスには、このイディオムの使用に問題があります。B<1>およびB<2>スワップメソッドを呼び出すと(仮想基本クラスメンバーを2回スワップします)、サブオブジェクトは変更されません!!!

A:

B

D:

S文字列を格納する単なるクラスです。

コピーを実行すると、A::sは変更されないままになります。

そして結果は次のとおりです。

おそらく追加B<N>::swapOnlyMeすると問題が解決します:

しかし、BがAから個人的に継承する場合はどうなりますか?

0 投票する
1 に答える
2231 参照

c++ - c ++ 11 std::moveおよびcopyandswapidiomを使用した'operator='のあいまいなオーバーロード

次のエラーが発生します。

次のコードをコンパイルする場合:

でコンパイルした場合g++ -std=c++11 main.cpp && ./a.out

この場合、コピーとスワップのイディオムを使用すると、あいまいさが発生する理由を誰かが理解するのを手伝ってもらえますか?

0 投票する
2 に答える
424 参照

php - 2つのhtmlファイル間でphpを使用して要素を交換します

php で解決しようとしている問題がありますが、php プログラミングに関しては全くの初心者です。問題は、jquery で html テーブルを変更していて、次にやりたいことはこれを交換することです。別の html ファイル内の別の正確なテーブル (一部のセルのクラスを除く) を持つテーブル

最初のファイルの名前が scheduleAdmin.html で、もう一方のファイル (同じディレクトリにある) に "転送" したいテーブルがあるとします。両方のファイルに、id='schedule' を持つこのテーブルがあります。

PHP を使えばこれは簡単な作業だと確信していますが、実際にはあまり進歩していません。

どんな助けでも大歓迎です

0 投票する
3 に答える
1393 参照

c++ - コピーアンドスワップイディオムの非効率性?

std::vectorクラス内にデータメンバーがあるコードをテストしていました。このクラスはコピー可能移動可能であり、コピーアンドスワップイディオムを使用してここでoperator=説明するように実装されます。

たとえば、大容量と小容量の2つvectorのがあり、 ()にコピーされた場合、の大容量は割り当て後も保持されます。次の呼び出しで新しい再割り当てを強制する必要がないため、これは理にかなっています(つまり、すでに使用可能なメモリを解放してから、ベクトルを拡張するために再割り当てしてもあまり意味がありません)。v1v2v2v1v1 = v2v1v1.push_back()

ただし、データメンバーとしてのクラスで同じ割り当てを行うとvector、動作が異なり、割り当て後はより大きな容量が維持されません。

コピーアンドスワップイディオムが使用されておらず、コピーoperator=と移動が別々operator=に実装されている場合、動作は期待どおりです(通常の非メンバーの場合と同様)。vector

何故ですか?最適なパフォーマンスを得るために、コピーアンドスワップのイディオムに従い、代わりにoperator=(const X& other)コピー op=)とoperator=(X&& other)移動)を別々に実装する必要がありますか? op=

これは、コピーアンドスワップイディオムを使用した再現可能なテストの出力です(この場合、後x1 = x2x1.GetV().capacity()1,000,000ではなく1,000になることに注意してください )。

これは、コピーアンドスワップのイディオムを使用しないx1.GetV().capacity() = 1000000出力です(この場合、予想どおりに注意してください)。

コンパイル可能なサンプルコードは次のとおりです(VS2010 SP1 / VC10でテスト済み)。

0 投票する
1 に答える
1044 参照

c++ - C++ : コピー アンド スワップ イディオム、代替コンストラクター

注: この質問は前の質問に続きます。新しい質問として引き続き質問しても問題ないことを願っています。

次のようなツリー クラスの「3.5 ビッグ ルール」(コピー アンド スワップ イディオム) を実装しようとしています。

私はこのガイドラインに従うように努めてきました。私のコピー代入演算子は次のようになります。

パブリックコンストラクターを機能させるのに苦労しています。誰かが私に次のようなことを提案しました:

このアイデアが機能するかどうかはわかりません。いずれにせよ、コンパイラから次のエラーが表示されます。

代わりに、次のアイデアを試しました。これはうまくいくと思いました。

しかし、それも機能していないようです。*this = Tree(&aTemp, &bTemp, depth, depth)問題は、コピー代入演算子( )を呼び出すときにコピーコンストラクターを呼び出す必要があることだと思います(コピー代入演算子の引数は値渡しであるため)が、これが行われていないようです。私はなぜなのか理解していない。

助けてくれてありがとう!