コンパイラーの最適化がオフになっている場合 (gcc -o0 ....)、「volatile」キーワードに違いはないと言ってよいでしょうか?
サンプルの 'C' プログラムをいくつか作成し、生成されたアセンブリ コードで揮発性と非揮発性の違いを確認したのは、コンパイラの最適化がオンになっている場合 ((gcc -o1 ....) のみでした。
コンパイラーの最適化がオフになっている場合 (gcc -o0 ....)、「volatile」キーワードに違いはないと言ってよいでしょうか?
サンプルの 'C' プログラムをいくつか作成し、生成されたアセンブリ コードで揮発性と非揮発性の違いを確認したのは、コンパイラの最適化がオンになっている場合 ((gcc -o1 ....) のみでした。
いいえ、そのような発言をする根拠はありません。
volatile
には、標準で規定されている特定のセマンティクスがあります。あなたは、すべての変数 (またはそうでない) がそれらのセマンティクスに準拠するgcc -O0
ようなコードを常に生成すると主張しています。volatile
これは保証されていません。特定のプログラムと特定のバージョンのgcc
.
-for GCC 4.7 以前では、おそらくvolatile
大きな違いはありません。gcc -O0
ただし、これはおそらく GCC の次のバージョン (つまり、現在のトランクである将来の 4.8) で変更されます。-Og
また、次のバージョンでは、デバッグに適した最適化も提供されます。
GCC 4.7 以前では、最適化が行われていないため、ある C (または GCC 内の内部表現である Gimple) 命令から次の命令まで、値が常にレジスターに保持されるとは限りません。
また、volatile
標準準拠のコンパイラと人間の両方にとって、特定の意味があります。たとえば、sig_atomic_t
変数が volatile
!
ところで、-fdump-tree-all
GCC のオプションを使用して多くのダンプ ファイルを取得したり、MELTドメイン固有の言語とプラグイン、特にそのプローブを使用して、グラフィカル インターフェイスを介して GCC の内部表現を照会したりできます。