2017-01-25 24 views
3

コンパイラは、多重定義された接尾辞演算子を最適化し、接頭辞演算子に置き換えることを許可されていますか?次のコードでは、ほとんどのコンパイラは++iとしてi++を扱い、同じアセンブリを生成し、例えばオーバーロードされた接頭辞/接尾辞コンパイラの最適化

(コンパイラが機能過負荷に何をするかを知っているものとします)。

for(int i=0; i<5; i++) 
    printf("*"); 

次に、次のコードについても同様に適用できますか?

class Integer { 
    int data; 
    Integer& operator++() { ++data; return *this; } 
    Integer operator++(int) { Integer ret = *(this); ++(*this); return ret; } 
    // And more overloads... 
}; 

for(Integer i=0; i<5; i++) 
    printf("*"); 

答えて

4

オプティマイザは、それがコードの動作を変更しない限り、何もを行うことを許可されています。 (これはthe "as-if" ruleとして知られています)

したがって、最初のスニペットでは++ii++はほとんどのコンパイラで同じものに最適化されます。 (それはかつてそうではありませんでしたが、それで私のような古い猫はforループでまだ++iを使用しています)。

2番目のケースでは、コンパイラは、返された結果が使用されていないと仮定して、名前付き戻り値最適化(NRVO)の拡張の一部として値のコピーを最適化できます。

関連する問題