- 821 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 13:04:16.49 ID:SsMAbqSz0.net]
- >>798
なお上記のGCC結果、或いは以下GCCのドキュメントは読んだ。 (ついでに後出の仕様書もチラ見したが、やはり今のところ君の理解がずれてるという見解だ。) https://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Optimize-Options.html#index-fstrict_002daliasing-750 ここでは以下コードがアウトだと言っている。 union a_union { int i; double d; }; int f() { double d = 3.0; // (C) return ((union a_union *) &d)->i; // (D) } アウトな理由だが、上記と794内URLによると、「『型違いのaliasはない』と仮定して最適化」する為であり、 つまり(C)はd名でdoubleに書き(D)はi名でint読み出しだから(C)と(D)は関係ない、 よって(C)はデッドコードでいきなり(D)の読み出ししてよし、ということらしい。 ただこれだとやはり上記(A)(B)は動く。(A)も(B)もfの読み書きであり、aliasして無いからだ。 この規定は「型違いの『aliasは』ないものとみなす」であり、aliasしてなければ関係ない。 今のところ見る限り、他の例も必ずalias(別名でアクセス)している。 なお正しくはunionを使え、ということらしい。>>763 まあ確かにunionはこれ用ではあるが、単発ならCキャストする奴が多いとは思う。 そもそもunionは撲滅対象だと思っていたのだが、これは意外だ。 (或いは仕様上 char*, unsigned char* については許可《どう見ても妥協だが》しているので、void*ではなくchar*にすればいい)
|

|