質問

あったかの正規の形式のためのオペレーター+,の存在を仮定して過オペレーター+=員機能は、このように:

const T operator+(const T& lhs, const T& rhs)
{
    return T(lhs) +=rhs;
}

そしていることが指摘されているところも作品:

const T operator+ (T lhs, const T& rhs)
{
    return lhs+=rhs;
}

本質的に、この形式の移転の仮設から本体の実行の機能ます。

もう少しにくい種類のパラメータは何が違うのだろうか。理由があります。に。

役に立ちましたか?

解決

を編集し、かつ、当初の形が好ましい。のコンパイラが最適な戻り値(き検証をブレークポイントのコンストラクタのためのT)最初の形式でもデータをもとに、パラメータとしてconstうにすることが望ましい。

研究室 戻り値最適化, など、このリンクとしての例: http://www.cs.cmu.edu/~gilpin/c++/performance.html

他のヒント

なんなのかが大きな違いは、生成されたコードです。

この二つの間に、(個人的には望んでおり、最初の形式でより良いを伝えています。これに関してもご利用に+=オペレーターとの熟の過templatized種類によりconst&.

しっくりくるかもしれません最初の形式で読みやす.

いったい私の最初のパラメータがコピーされます。なかったので期待します。したがって、両方のバージョンによって効率の高いこなっているのは読みやすくなりました。

const T operator+(const T& lhs, const T& rhs)
{
    return T(lhs)+=rhs;
}

なぜないことをご希望の場合はterseness?

私が最初に思いをはせる第二版がinfinitessimallyよりも早く最初でない参照を押すと、スタックの引数に使います。しかし、このことは非常にコンパイラに依存状のためのインスタンスかどうかのコンパイラを名前の戻り値には最適です。

とにかく、ということを私たちは何の疑問も、この選択のための非常に小さな性能を得ることがないものが存在すような必要をお選びニによる初めてとなります。

実際、第二のが好ましい。に記載されたc++の標準

3.7.2/2:自動保存期間

合名の自動オブジェクト 初期化またはデストラクタと 副作用することはありません 破壊される前にブロック のみならず消去して 最適化の場合でも示すことにより 未使用を除き、このクラスオブジェクト そのコピーの排除されてい 指定され12.8.

その理由は、名もない一時オブジェクトを作成するには、コピーコンストラクタ、コンパイラを使用しないものの返り値があると思われる。の場合には、その名前のない戻り値の最適化が可能です。注の場合はコンパイラの実装名を返却値最適化、最高のコードが

const T operator+(const T& lhs, const T& rhs)
{
    T temp(lhs);
    temp +=rhs;
    return temp;
}

ると思いまinlinedは多岐にわたっていうかどうかだけの転送機能、およびそのオペレーター+=()関数は、ライン)い近似コード。とはいえ、最初により正規の.第二版は不必要な"のかわいい".

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top