4

コンパイラーの最適化がオフになっている場合 (gcc -o0 ....)、「volatile」キーワードに違いはないと言ってよいでしょうか?

サンプルの 'C' プログラムをいくつか作成し、生成されたアセンブリ コードで揮発性と非揮発性の違いを確認したのは、コンパイラの最適化がオンになっている場合 ((gcc -o1 ....) のみでした。

4

2 に答える 2

10

いいえ、そのような発言をする根拠はありません。

volatileには、標準で規定されている特定のセマンティクスがあります。あなたは、すべての変数 (またはそうでない) がそれらのセマンティクスに準拠するgcc -O0ようなコードを常に生成すると主張しています。volatileこれは保証されていません。特定のプログラムと特定のバージョンのgcc.

于 2013-01-05T08:23:24.947 に答える
3

-for GCC 4.7 以前では、おそらくvolatile大きな違いはありません。gcc -O0ただし、これはおそらく GCC の次のバージョン (つまり、現在のトランクである将来の 4.8) で変更されます。-Ogまた、次のバージョンでは、デバッグに適した最適化も提供されます。

GCC 4.7 以前では、最適化が行われていないため、ある C (または GCC 内の内部表現である Gimple) 命令から次の命令まで、値が常にレジスターに保持されるとは限りません。

また、volatile標準準拠のコンパイラと人間の両方にとって、特定の意味があります。たとえば、sig_atomic_t変数 volatile!

ところで、-fdump-tree-allGCC のオプションを使用して多くのダンプ ファイルを取得したり、MELTドメイン固有の言語とプラグイン、特にそのプローブを使用して、グラフィカル インターフェイスを介して GCC の内部表現を照会したりできます。

于 2013-01-05T08:23:41.550 に答える