質問するログイン新規登録

回答編集履歴

2

グローバル変数なので代入は消せない

2016/08/01 05:29

投稿

maisumakun
maisumakun

スコア146853

answer CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
  デバッグモードでは、デバッグの都合上、「C言語での行」と対応付けをするように機械語を生成しますので、行を超えるような最適化は基本的に行われません。
4
4
 
5
- 一方で、リリースビルドにすると、`dt1`、`dt2`、`dt3`は代入しても**後全く使いません**ので、最適化で変数ごと消してしまうことります。この場合、`volatile`なしでは`vdata`への参照も消してしまうのに対して、`volatile`ありの時は`vdata`の読み取りをソースコード上と同じく、3回行います。
5
+ 一方で、リリースビルドにすると、`dt1`、`dt2`、`dt3`への代入「同じ」`vdata`の値を代入するの、一度読み取ってレジスタに置いておいて、2回め以降はそれを使い回すという最適化が可能となります。`volatile`ありの時はそうもいかないので、`vdata`の読み取りをソースコード上と同じく、3回行います。

1

最適化レベルの注記

2016/08/01 05:29

投稿

maisumakun
maisumakun

スコア146853

answer CHANGED
@@ -1,5 +1,5 @@
1
1
  おそらく、デバッグモードでコンパイルしているから違いが出ないのではないかと思います。
2
2
 
3
- デバッグモードでは、デバッグの都合上、「C言語での行」と対応付けをするように機械語を生成しますので、最適化は基本的に行われません。
3
+ デバッグモードでは、デバッグの都合上、「C言語での行」と対応付けをするように機械語を生成しますので、行を超えるような最適化は基本的に行われません。
4
4
 
5
5
  一方で、リリースビルドにすると、`dt1`、`dt2`、`dt3`は代入しても**後で全く使いません**ので、最適化で変数ごと消してしまうことがあります。この場合、`volatile`なしでは`vdata`への参照も消してしまうのに対して、`volatile`ありの時は`vdata`の読み取りをソースコード上と同じく、3回行います。