タグ付けされた質問 「return-value-optimization」

4
コピーの省略と戻り値の最適化とは何ですか?
コピーエリクションとは何ですか?(名前付き)戻り値の最適化とは何ですか?彼らは何を意味しますか? どのような状況で発生する可能性がありますか?制限とは何ですか? この質問を参照された場合は、おそらく導入部を探しているでしょう。 技術概要については、標準リファレンスを参照してください。 一般的なケースについては、こちらをご覧ください。

7
C ++では、関数からベクトルを返すことはまだ悪い習慣ですか?
短いバージョン:多くのプログラミング言語では、ベクトルや配列などの大きなオブジェクトを返すのが一般的です。クラスにmoveコンストラクターがある場合、このスタイルはC ++ 0xで受け入れられるのですか、それともC ++プログラマーは奇妙/醜い/退屈であると考えていますか? 長いバージョン: C ++ 0xでは、これはまだ悪い形式と見なされていますか? std::vector<std::string> BuildLargeVector(); ... std::vector<std::string> v = BuildLargeVector(); 従来のバージョンは次のようになります。 void BuildLargeVector(std::vector<std::string>& result); ... std::vector<std::string> v; BuildLargeVector(v); 新しいバージョンでBuildLargeVectorは、から返される値は右辺値であるためstd::vector、(N)RVOが発生しないと仮定すると、vはの移動コンストラクタを使用して構築されます。 C ++ 0xの前でさえ、(N)RVOのために最初の形式はしばしば「効率的」でした。ただし、(N)RVOはコンパイラーの裁量に任されています。これで右辺値参照ができたので、ディープコピーが行われないことが保証されます。 編集:質問は本当に最適化についてではありません。示されている両方の形式は、実際のプログラムでほぼ同一のパフォーマンスを持っています。一方、最初の形式では、パフォーマンスが大幅に低下する可能性がありました。その結果、最初の形式は、長い間C ++プログラミングの主要なコードのにおいでした。もういいんじゃないの?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.