2009-07-17 14 views
4
Cで

++このような文は有効です:IMOそれはどんな意味がありませんC++:コンパイラは&変数を最適化しますか?離れて?

&Variable; 

ので、私の質問は、あなたがこれを行う場合、それはどのような方法でコンパイルされた結果に影響を与える、または意志ます、ですコンパイラはそれを最適化しますか?

ありがとうございます!

+1

あなたはコードでこれを見ている場合、それは「未使用のパラメータ値」または「変数未使用」の警告を取り除くための試みだということが可能です。他のオプションは、パラメータを無名(C89で無効なので共有ソースには役に立たない)のままにするか、最初に変数を定義しないか(コンストラクタに必要な副作用がある場合は使用しません)、または通常の方法これはvoidにキャストされます: '(void)Variable; ' –

答えて

6

オペレータ&()は変数型のためにオーバーロードされている可能性があります。副作用があり、そのような文を最適化するとプログラムの動作が変わる可能性があります。

非C++オブジェクトを制御するためのスマートポインタの例 - _com_ptr_tです。 これはオーバーロードされた_com_ptr_t :: operator &()があり、内部のポインタにすでにヌル以外のアドレスが格納されているかどうかを確認します。格納されたアドレスがnullでないことが判明した場合は、ポインタがすでにオブジェクトにアタッチされていることを意味します。その場合、_com_ptr_t ::演算子&()はオブジェクトを切断し、IUnknown :: Release()を呼び出してポインタをnullに設定します。

典型的な使用は、このているため、ここで副作用が必要である:

_com_ptr_t<Interface> pointer; 
// some other code could be here 
CoCreateInstance(..., &pointer, ...);// many irrelevant parameters here 

CoCreateInstance()または他のそれは単にそれに渡されたアドレスを上書きするように、オブジェクト検索コードはC++と_com_ptr_tについての考えを持っていません。そのため、_com_ptr_t ::演算子&()は、ポインターがあればそれが接続されているオブジェクトを最初に解放する必要があります。

だから、_com_ptr_tこの文のために:

&variable; 

variable = 0; 

と同じ効果を持つことになりますし、それを離れて最適化するプログラムの動作を変更します。

+0

+1良い答え。かつて_com_ptr_tのそのプロパティは、一度王位に私のお尻に私をビット - 私は、その機能がメンバー機能にあることを望むだろう。 – peterchen

+0

私は何を言おうとしていましたか?過負荷なしで最適化する可能性が高い – peterchen

2

これは、使用するコンパイラとコンパイルオプションによってまったく異なります。コンパイラがそのようなステートメントのコードを生成しないようにすることは、C++標準には何もありません。

+0

ありがとう!私の場合はVS 2005を使用します。 – clamp

+0

おそらく最適化されています。 – Goz

+0

C++標準では、生成されたコードについては何も言いませんか? –

1

削除しますか?プログラムの動作を変更する可能性がありますか?

変数のクラスが演算子のアドレス(演算子&)を上書きすると、副作用が発生する可能性があります。

10

はこのスニペットを考えてみます。この場合、

#include <iostream> 
class A { 
public: 
    A* operator &() { 
     std::cout << "aaa" << std::endl; 
     return this; 
    } 
}; 

int main() { 
    A a; 
    &a; 
    return 0; 
}; 

を、"&a;"コードを生成します。

1

はい、そのようなステートメントは最適化される可能性があります。これは、変数への参照を取ってそれを放棄することを意味します。コンパイラが「最適化なし」に設定すると、このステートメントのコードが生成されることがありますが、本質的にノーオペレーションであり、最適化を行うとこのステートメントはなくなります。

0

スタックまたはレジスタのローカル変数への参照があるようです。コンパイラが現在実行していることを確認する最も良い方法は、Visual Studioで逆アセンブリビューを表示することです。

Disassembly view in Debugger (Visual Studio Orcas)

関連する問題