2011-08-22 7 views
9

は、それがC++ 0xのコンパイラのための法的このC++ 0x最適化は合法ですか?

int func(int&& a){ 
    return 3; 
} 

int func(int&& a){ 
    a = 3; 
    return a; 
} 

を最適化するためですか?機能が同等であることを変数aを変更する必要がありますので、 (または別のPOD用)

答えて

8

は、その自体が好きではありません。それは言った、インライン化や些細な最適化のビットの後、結果は同じになります。

int x = func(5); 

// pseudo-inlined: 
int __temp = 5; // the temporary created by binding 5 to int&& 
__temp = 3; // a = 3; 
int x = __temp; // return a; 

// constant propagation: 
int __temp = 5; 
__temp = 3; 
int x = 3; 

// dead-code elimination: 
int x = 3; 

注結果は、一時的な変数は「wasn理由だけで、あなたがfuncの2番目の定義を使用してインライン化する場合と同じです使用される。これは、2つの関数が一般的に等価でないことを示しています。

int modifyme = 100; 
int x = func(std::move(modifyme)); 

// modifyme must be 3, second function definition wouldn't do that 
+0

オブジェクトを移動した後に値を読み取るのはUBだと思いました。そうじゃないの? –

+0

思ったこともありますが、これが当てはまらないと、私は非常に驚いています。しかし、単なる値を残しているプリミティブ型の方が明らかに安価なオプションです(複雑な型については、 – Voo

+0

少なくとも、(デストラクタのない)PODの場合、UBになると思っていました。非PODの場合、それらは変更する必要がありますので、すべてのポインタを0に設定してデストラクタが何もしないようにしてください。 – Emil