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

回答編集履歴

1

微修正

2018/08/28 16:00

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -8,7 +8,7 @@
8
8
  「オブジェクトに格納された値に対するアクセスは,次のうちのいずれか1つの型を持つ左辺値によらなければならない。」は、このルールに従えば、その「変なこと」に該当しないということですね。
9
9
 
10
10
  yohhoyさんの記事の「壊れたバージョン」のプログラムの`uint16_t *ptr=(uint16_t*)&acopy;`の`*ptr`は`acopy`と互換性がないため、`ptr`が`acopy`の一部をポイントしていないとコンパイラは仮定してよいわけです。(どうみてもポイントしてますが、ルール上それが許されることになります。)
11
- ということは、ptrが指す先はどこかあらぬメモリとして解釈できるわけです。あらぬメモリへの操作は最適化によりまるっと削除しても「正しいプログラム」の動作には影響しないと仮定して良いということです。だから、コンパイラは削除してもよいので、削除するコンパイラも存在するという流れです。
11
+ ということは、ptrが指す先はどこかあらぬメモリとして解釈できるわけです。あらぬメモリへの操作は最適化によりまるっと削除しても「正しいプログラム」の動作には影響しないと判断して良いということです。だから、コンパイラは削除してもよいので、削除するコンパイラも存在するという流れです。
12
12
 
13
13
  [古いコンパイラでは再現しました](https://wandbox.org/permlink/m15lp5figZNDFlbl)。警告もでます。しかし、これより新しいものではことごとく再現せず、警告もでませんでした。削除しないコンパイラも少なくないということですね。
14
14