2011-02-08 15 views
2

私は変数をvolatileと宣言していますが、プログラム内のどこでも使用しないと、コンパイラはその変数を最適化しますか?未使用の揮発性変数

この場合、揮発性変数のローカル宣言とグローバル宣言の場合はどうなりますか?

tq。

+3

「volatileキーワードは、コンパイラが未使用の変数にストレージを割り当てるかどうかとは関係ありません。」以下のJim Balterのコメントを強調する。 'volatile 'はコンパイラの出力に影響すると思いますか? – pascal

答えて

6

コンパイラは未使用のvolatile変数宣言を排除(無視)できますが、コンパイラは未使用のグローバル変数定義を排除できません。他の変換単位(TU)がそれを参照すると仮定する必要があります。

変数が関数に対してローカルで使用されていない場合は、変数のボラティリティに関係なくコンパイラによって削除されます。意味のある局所的な変数があることは明らかではありませんが、そのアドレスをコードに渡して割り込みハンドラがその変数に書き込むようにする関数を呼び出すことができます。その結果、ボラティリティが実現します(しかし、使用された変数)。

volatile修飾子は、変数にアクセスするコードをコンパイラがどのように生成するか(影響を与えます) - コードが変数にアクセスしない場合は、そのコードを変更する必要はありません。変数。それは存在しないかもしれません。


さらに思考:

変数はstatic volatile、ソースコードで参照されていない場合には、それを排除することができますか?

答えは(ほぼ確実)はいです。ソースの変数への参照はなく、ポータブルな方法でアクセスできる唯一の方法は、参照する必要があります。考えられるポータブルでないハッキングには、複数のそのような静的変数を定義し、そのうちの1つの関数への参照をある関数に渡すことが含まれ、その関数はアドレス操作によって他の変数にアクセスできることを期待します。しかし、このようなコードは、大変厄介で、移植性がありません。そのような人の著者はおそらくどこかに戻って、そのようなコードを書き直すことから静かに断るべきです。

したがって、グローバル変数定義は削除できません。別のTUから参照される可能性があります。未使用の静的変数定義を削除することができます。未使用のローカル変数定義を削除することができます。これは問題の変数にvolatile修飾子があるかどうかにかかわらず適用されます。

+2

私はコンパイラがそれをどうやってできるのだろうと思っています。一度に1つのユニットのみをコンパイルし、その変数が静的であると宣言されていない場合、その変数が他の場所で使用されているかどうかを知ることはできません。これはリンカの仕事のように見えます。 –

+0

@Sergey:コンパイラの背後にある何かが値を0から何かに変更しない限り、質問者は'external volatile variable 'または 'define'のように' declare 'を意味しましたか? 'volatile int variable = 0;'他)?私は偶然、「宣言」は「宣言」を意味すると想定していました。あなたは正しい。コンパイラはグローバル変数定義を削除することはできません。未使用の変数宣言は無視できます。 –

+0

@ジョナサン、ここで良い点。私はそれに気づいていませんが、質問が本当に「宣言」と言っているのであれば、私はその意味を理解していません。宣言を「最適化する」とはどういう意味ですか?変数の定義をストレージの使用量の観点から最適化することはできますが、宣言は純粋にコンパイル時のものですが、最適化するためには何がありますか? –

-1

変数が使用されていない場合は、それがすべての状況にとって最適です。最適化は、演算と計算の場合にのみ行われます。

データに対して操作が実行されない場合、最適化は必要ありません。

+0

コンパイラは、プログラムサイズを最適化することもできます。未使用の変数を取り除くことは、最適化です。 –

+0

この回答は主に正しいものであり、低下するに値しませんでした。事実、C標準では、コンパイラのセマンティックモデルをいかに揮発性に制限するかを指定するだけです。ストレージの割り当てについては何も言いません。 volatileキーワードは、コンパイラが未使用の変数にストレージを割り当てるかどうかは関係ありません。 –

3

volatileはストレージ割り当てとは無関係です。volatileキーワードを使用しない未使用の変数をコンパイラが削除すると、volatileキーワードを使用してコンパイラが削除される可能性があります。確実に知りたければ、生成されたコードまたはシンボルテーブルを確認してください。

関連する問題