10

私が機能を持っているとしましょう

std::Vector<Point> calculate() {
   std::Vector<Point> points; //do stuff with points
   return points;
}

void calculate(std::Vector<Point>& points) {
   //do stuff with points
}

したがって、私の質問はスタックで初期化されたオブジェクトに固有であり、stlオブジェクトです。パフォーマンスに違いはありますか、そしてそれを行うための一般的な方法は何ですか

よろしく

4

3 に答える 3

13

値を参照パラメーターとして使用すると、次のプロパティがあります。

  1. コピー、移動、またはその他の操作は行われません。
  2. 戻り値をユーザー側ですぐに破棄することはできません。関数の参照パラメータなどに一時的なものを押し付けることはできません。変数を宣言する必要があるため、現在のスコープ内に存在する名前を付ける必要があります。
  3. APIは、値が入力/出力パラメーターであることを示唆しています。つまり、読み取りと書き込みが行われる値が渡されます。そうでない場合は、それを使用すると、次善のAPI設計要素になります。

値を返すには、次のプロパティがあります。

  1. コピーの省略が利用できない場合(関数の実装の性質、貧弱なコンパイラ、または戻り値が新しい値を初期化していないため)、戻り値は移動されます。コピーされません。移動は無料ではありませんが、一般的には、いくつかのポインタのコピーよりもはるかに高価ではありません。新しいオブジェクトやメモリが割り当てられたり、割り当てが解除されたりすることはありません。
  2. APIは、値の出力の性質を強制します。何も渡さないため、ユーザーが渡した出力を操作する方法はありません。同様に、関数は何も受け取らないため、値を読み取る方法はありません。これは出力です。値、期間; 関数はそれを生成して返します。
  3. 戻り値は、ユーザーの指示ですぐに破棄できます。明らかに、ユーザーがこれを頻繁に行っている場合は、何かが間違っていることを示唆していますが、出力値を保持するかどうかはユーザーが決定します。
于 2012-08-21T17:00:49.710 に答える
10

コピーの省略のため、パフォーマンスは同じになる可能性が非常に高くなります。

2つの方法が表現するものは異なります

std::vector<Point> calculate()

ベクトルを返します(おそらくいくつかのパラメーターに基づいています)。

void calculate(std::vector<Point>& points)

既存のベクトルを変更します(ここでも、おそらくパラメーターに基づいています)。

于 2012-08-21T14:18:06.263 に答える
2

私の謙虚な意見:戻り値は解決するよりも多くの問題を引き起こします...それらはより単純に見え、呼び出しセグメントではより簡潔ですが、右辺値の参照は避けられます...

欠点は、表現力が低下することですが、メモリ割り当てなどのリソースが上流に移動するため、コストはわずかです。

C ++は、構文とリソース管理の観点から大幅に簡素化する必要があり、大幅に簡素化できます。

于 2020-12-12T22:06:02.550 に答える