2011-03-17 5 views
4

まず、私は自分自身を守らなければならないと感じています。私はおそらく、このようなこと、時期尚早の最適化と無駄を心配するべきではないことを知っています。知っている。私は興味があり、ソリューションを自分で見つけることができない(またはわからない)ため、これを純粋に求めています。定数の除算はコンパイラによって最適化されていますか?

コンパイラが定数の整数除算を最適化するのは一般的なプラクティスですか?このような何か:

const int FOUR = 4; 
const int TWO = 2; 
int result = FOUR/TWO; 

ように最適化:

const int FOUR = 4; 
const int TWO = 2; 
int result = 2; 

編集:私は答えは、コンパイラからコンパイラに変動することが非常に承知しているその一般的な方法ならば、私はほとんど興味があります。

答えて

6

はい、実際には普遍的な習慣ですが、実際にはコンパイラがそれをしない場合、実際には非常に珍しいコンパイラがあります。

3

はい、最適化が有効になっている場合は一般的ですが、コンパイラによって異なります。 Visual C++ 9はこれを行います。

あなたが本当に気にしているのであれば、放出されたアセンブリを検査する必要があります - これが唯一信頼できる方法です。

1

私はあなたのものと非常によく似たコードをコンパイルしてデバッグしましたが、私の経験からは「はい」と言います。しかし、それはコンパイラからコンパイラに変わる可能性があります(私は主にMSC8-MSC10に固執します)。

1

これは、コンパイラの発言において「定数フォールディング」と呼ばれ、現代のコンパイラでは一般的です。最適化できる部門だけではありません。多くの型の定数式を単一のコンパイル時定数に減らすことができます。

2

整数には「定数フォールディング」は問題ありませんが、浮動小数点では問題が発生する可能性があります。例えば

http://www.nullstone.com/htmls/category/consfold.htm

一部の環境では 、実行時に動的に変更することができますいくつかの 浮動小数点の丸めモードをサポートしています。 これらの環境では、丸めモードがコンパイル時に知られていない場合は、 (1.0/3.0)などの式は の実行時に評価する必要があります。

4

これは一般的に言えば、実際には言語によって必要とされています。 result constを宣言すると、それは整数の定数式であり、配列の次元のようなものに使うことができます。したがって、コンパイラは数値を知る必要があります。これは、最適化がオフになっているビルドでも発生する1つの「最適化」です。

2

はい。しかし、考えてみます。操作の

void f(int x) 
{ 
    return x*3/4 
} 

注文は文句を言わないコンパイラ

+0

良い例です。 – AShelly

+0

私はすでにこれが事実であると思っています。私はいつも最後の可能な操作として分割を続けようと、このような場合には常にかっこでリベラルです。 – Anthony

1

答えがある一方で減少する3/4を意味し、「はい」いずれかの人気のコンパイラのために、私は調べることができ助言しますデバッガでコードを逆アセンブルして自分自身を検証します。あなたは将来他の問題に適用できるスキルを習得することができます。

関連する問題