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

回答編集履歴

1

m

2018/08/28 14:51

投稿

yumetodo
yumetodo

スコア5852

answer CHANGED
@@ -1,3 +1,25 @@
1
1
  > のような状態であるとき、"ali_s"と"ali_u"のポインタは、変換におけるアラインメントが正しければ上記の規則によって、main関数内の4つのオブジェクトのエイリアスになることができ
2
2
 
3
- アラインメントとか以前に何の関係もない赤の他人です。strict aliasing rules以前の問題。
3
+ アラインメントとか以前に何の関係もない赤の他人です。strict aliasing rules以前の問題。まずunionがなにか調べてください。
4
+
5
+ ---
6
+
7
+ その構造体・unionに関してのstrict aliasing rulesってのは、私はC++規格書リーディング初心者なのであってるかわかりませんが、
8
+
9
+ > [(翻訳)C/C++のStrict Aliasingを理解する または - どうして#$@##@^%コンパイラは僕がしたい事をさせてくれないの! - yohhoyの日記](http://d.hatena.ne.jp/yohhoy/20120220/p1)
10
+ > アグリゲート(structまたはclass)もしくはunion型は、その内部に含む型のaliasとできます。(例:関数にintへのポインタが渡された場合、内部にintを含むstructやunionへのポインタ、もしくはintを含む別のstructやunionを含む型、もしくは...と際限なく、int*は別のポインタが指すstructやunionに含まれるintを指すことができます。)
11
+
12
+ を解釈するとおそらく次のようなことを指します。
13
+
14
+ ```cpp
15
+ struct Hoge {
16
+ int fuga;
17
+ };
18
+ int main()
19
+ {
20
+ Hoge hoge;
21
+ hoge.fuga = 2;
22
+ }
23
+ ```
24
+
25
+ というコードがあったとき、`hoge`は`fuga`のaliasだと思われます。これはよく考えればそうおかしいことではないです。なぜならば、構造体というのはつまるところポインタでアクセスしているからです。メンバーアクセスに使う演算子`.`は、多くの処理系では右辺の識別名からコンパイル時に構造体型変数のアドレス内でのオフセットを認識し、ポインタ演算でその要素にアクセスするコードを出力します(最適化は考えない)。