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