2016-06-11 13 views
6

C++では、A + = BがA = A + Bよりも好ましく、++ AはA ++になりますか?C++では、A + = BがA = A + Bよりも好都合です。++ AはA ++になりますか?

"++ A"プリインクリメントは少なくとも "A ++"ポストインクリメントと同じくらい速いことが保証されています。これは、herehereを含む多くの場所で議論されています。同様に、A + = Bは少なくともA = A + Bと同じ速さであると予想され、hereとなる。

私は++のために、このを見ていた:

//From https://herbsutter.com/2013/05/13/gotw-2-solution-temporary-objects/ 
T T::operator++(int)() { 
auto old = *this; // remember our original value 
++*this;   // always implement postincr in terms of preincr 
return old;  // return our original value 
} 

私の推論は、(おそらく、複雑なオブジェクト型からの)最悪の場合にはA = A + Bを取得し、店舗Aのとで追加する必要がありますということですBを元のA位置に戻す前にBを押して、A + = BをBにしてAに直接追加します。私の推論は正しいのですか?

基本タイプはコンパイル時に同じように並べ替えられ、実際にはオペレータのオーバーロードが必要な複雑なオブジェクトにのみ適用されることが予想されます。

これは一般的にほとんどの命令型言語にまで及んでいますか?

+0

一部のアーキテクチャでは 'a ++'が好ましいです。 – EJP

+2

このレベルの最適化について心配しているのであれば、高級言語を使用してはならないかもしれません... –

+1

Re:「これは一般的に最も基本的な言語にまで及んでいますか?」:C++は、非プリミティブ型の値割当のレベル概念。その質問はほとんどの他の言語の文脈でも意味をなさない。 (もちろん、プログラマは 'a.add(b)'が 'a.setData(a.plus(b))'と等価であるように 'setData'と' plus'と 'add'を定義するかもしれませんが、その時点で – ruakh

答えて

4

C++は演算子のオーバーロードがであることを意味します。つまり、+=演算子は期待するものとはまったく異なる意味を持つ可能性があります。

+=オペレータは、唯一の「先」クラスはそれのために定義された+=演算子を持っていないかのように追加しに割り当てる機能します。オペレータのオーバーロードはまた、オペレータオーバーロードのためにxのクラスインスタンスが何を定義するかによって、x++が異なることを意味し得ることを意味する。

+1

* "+ =演算子は、"宛先 "クラスに+ =演算子が定義されていない場合、addおよびassignとしてのみ機能します。宛先クラスに 'operator + ='が定義されていない場合、 '+ ='はそれに対して全く機能しません。 –

+2

これは当てはまります(またはBenjamin Lindleyのコメントに一度触れることになります)が、本当にその質問には答えないと思います。いくつかのC++コードはひどいので、プロジェクトにコードを許可するかどうかを決める前にコードを調べることを知っておくとよいでしょう。しかし、OPは明らかに、プロジェクトに既に許可されているひどいコードを使用する最善の方法にもっと興味を持っています。 (そしてFWIWでは、オペレータは明らかにオペレータのオーバーロードを認識しています。これは名前で言及しており、 '++ x 'に関して' x ++'を実装する例を示しています) – ruakh

+1

これはあまりよく分かりません。 C++では、すべてのコード行は、あなたが期待するものとはまったく異なるものを意味することがあります。 5人の別々の神からの書面による許可なしに、誰も「面白い」目的のために事業者を過負荷にするべきではない。 – Roddy

6

私は理由が全く同じではないと言います。 A = A + BよりA += Bを好む主な理由は簡潔です。 A += BはっきりAは、より複雑な式である場合は、これは特にそうであるAにBを追加したいと述べている:

node_capacities[std::make_pair(node1,node2)] += edge.capacity; 

私はA += BのパフォーマンスはどちらかA = A + Bよりも悪いことが判明したことがありません。

1

ほとんどの場合、A + = Bが好ましい。あなたが指摘したように、A = A + B対A + = Bにもっと多くのレジスタ負荷が存在します。また、興味があるのはSSAです。これはコンパイラの最適化に使用され、そのようなケースがどのように処理されるかを理解するのに役立ちます。あなたが言ったように、これらの考慮事項のほとんどは、コンパイラのおかげでプログラマの手に渡されますが、これらのことを認識することは良いことです。

複雑なオブジェクトを考慮するもう1つの考慮点は、ゲッターを呼び出すことによって引き起こされる可能性のある副作用と、そのようなゲッターを2度呼び出すためのフォールアウトです。 (考える、A.get()= A.get()+ B.get())。これはゲッターがほとんどの場合副作用を起こすべきではないので、これは比較的稀です。

+0

あなたの "A.get()= A.get()+ B"でget() "、タイプAのget()メソッドはアドレスを返すでしょうか?そうでなければ、" A.set(A.get()+ B.get()) "でなければならないのはなぜですか? – MathFromScratch

-2

実際には、C++で、あなたは後置演算子を避ける必要があります。

  • ++ここではA //演算子は++ ++ //ここでオペレータが++
を後置され
  • 前に置かれています

    ポストフィックスされたソリューションでの値を使用する場合は、が値を大きくします。これは何度か危険なことがあり、少なくともパフォーマンスを低下させる可能性があります。

    さらに詳しい情報については、hereをご覧ください。

  • +2

    A = A + Bは三項式のユーザー定義演算子であるため、質問は答えません – anatolyg

    2

    A += B;をお勧めします。

    あなたはA = A + B;A += B;よりも優れていることが判明種類を書いた場合、あなたはA = A + B;がする正確に何を行うにoperator+=の実装を変更する必要があります。

    しかし、逆は一般的にできません。 A = A + B;A += B;とまったく同じようにするには、通常、適切な方法でoperator+を変更することはできません。

    したがって、A += B;A = A + B;の間に違いがある場合は、A += B;がより適切な選択肢になるはずです。

    +0

    Ahh、それは良い点です - //www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf)と[これについての質問](http://stackoverflow.com/questions/17953437/c-why-それは不可能であり、過負荷になることはありません)、そうでないようです。 – MathFromScratch

    関連する問題