1

正しい値をサポートするコンパイラでパフォーマンスが優れているのはどの集合メソッドですか: with または without const&? 例えば

class A
{
public:
    void setProperty(Property const& p)   {m_property = p;}
    void setProperty(Property p)          {m_property = p;}
};

それとも両方飼っても大丈夫ですか?ここPropertyは大規模なクラスです。Visual Assist X のリファクタリング ツールは、2 番目のものを なしで使用しconst&ます。

4

5 に答える 5

2

こっちの方がいい

void setProperty(Property const& p)   {m_property = p;}

PropertysetProperty 関数に入ると のコピーを 1 つ保存し、Property非常に安価な参照のみをコピーします。

于 2013-07-29T02:25:01.850 に答える
1

その疑問は型を見ることでしか答えられないProperty移動操作を実装する場合、最良の方法は引数を値で取得し、内部で移動することです。

void setProperty(Property p)   {m_property = std::move(p);}

引数が左辺値の場合、コピーはインターフェイスで行われ、内部で値を移動します。コストはコピー 1 回と移動 1 回です (移動は安価である必要があります)。関数への引数が一時的なものである場合、コンパイラはコピーを省略できます (そうでない場合は、 copyではなく移動する必要があります)。次に、関数は、1 回 (または 2 回) の移動操作の合計コストで内部的に別の移動を実行しますが、これは安価です。

を渡しconst&た場合、引数が一時的な場合、コンパイラはコピーを除外できず、2 つのコピーに対して支払うことになります。

完全な転送を使用するという提案に関しては、 Property型のインターフェイスにアクセスできる場合 (メンバーを保持しているため、必要です)、セッターをテンプレートにする必要はありません。これにより、不要な余分なコードが生成されます。最終的な実行可能ファイルであり、他のメンテナにとって不必要な複雑さです。

于 2013-07-29T03:36:04.507 に答える
0

一般に、オブジェクトのコピーを節約できるため、参照渡しが最適です。オブジェクトが小さく、コピー動作が単純な場合 (いくつかの int とデフォルトのコピー コンストラクターがある場合)、オブジェクトをコピーするコストは無視できます。オプティマイザーは、関数が受け取ったオブジェクトを変更できるものがないことを認識しているため、場合によっては、値渡しの方が高速になることがあります。プロパティが何かわからないので、それが大規模または複雑なクラスである場合は、参照渡しします。疑わしい場合は、参照渡ししてください。

C++11 では、ムーブ コンストラクターなどが原因で状況が異なる場合がありますが、私はそれらを完全には理解していません。しかし、このアドバイスに間違いはないでしょう。迷ったら参考にしてください!

于 2013-07-29T02:44:10.893 に答える
0

定数参照を使用する場合は、オブジェクト全体 (クラス Property) をコピーするのではなく、関数へのポインターのみを送信します。これにより、特にプロパティが大きい場合に、時間を節約できます。さらに、貴重なメモリを節約できます。

ただし、const& のため、変更を加えることはできません。const を削除すると、元のオブジェクトに変更が加えられます。

要約すると、何も変更せずにプロパティ オブジェクトから情報を取得するだけの場合は、定数参照 (const&) が最適な方法です。

于 2013-07-29T02:36:25.723 に答える