回答編集履歴

4

fix c

2018/08/29 02:54

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -80,7 +80,7 @@
80
80
 
81
81
  struct S {
82
82
 
83
- double b
83
+ double b;
84
84
 
85
85
  int i;
86
86
 
@@ -96,7 +96,7 @@
96
96
 
97
97
  // 下記の処理によりメモリ位置*aが書き換わる可能性がある
98
98
 
99
- S t = { 3.14, 42 };
99
+ struct S t = { 3.14, 42 };
100
100
 
101
101
  *s = t;
102
102
 

3

fix

2018/08/29 02:54

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- "Strict Aliasing Rules"の本題は、Cコンパイラは「変数型が異なる場合は、互いにエイリアス(別名)となっている可能性を想定なく良く」、「エイリアス不在を仮定した生成コード最適化を行っ良い」というものです。"Strict(厳密な)"とは、コンパイラ視点からは「型に互換性がある場合は、互いにエイリアス(別名)の**可能性を考慮すべき**」、プログラマ視点からは「互換性のない型でエイリアスを**作ってはいけない**」というニュアンスから来ています。
9
+ "Strict Aliasing Rules"の本題は、Cコンパイラは「変数型が異なる場合は、互いにエイリアス(別名)となっている可能性を排除して良く」、「エイリアス不在を前提とした生成コード最適化をて良い」というものです。"Strict(厳密な)"とは、コンパイラ視点からは「型に互換性がある場合は、互いにエイリアス(別名)の**可能性を考慮すべき**」、プログラマ視点からは「互換性のない型でエイリアスを**作ってはいけない**」というニュアンスから来ています。
10
10
 
11
11
 
12
12
 
@@ -18,7 +18,7 @@
18
18
 
19
19
 
20
20
 
21
- 上記5つのルールは、"Strict Aliasing Rules"の**例外事項**を規定しています。例えば5番目「文字型(a character type)」は、基本ルールでは`int`型と`char`型は互換性のない型なのでエイリアスになってはいけないが、例外規定により「エイリアスになり得ると考慮すべき(コンパイラ視点)」「エイリアスを作っても良い(プログラマ視点)」という意味です。
21
+ 上記5つのルールは、"Strict Aliasing Rules"の**例外事項**を規定しています。例えば5番目「文字型(a character type)」は、基本ルールに従うと`int`型と`char`型は互換性のない型なので互いにエイリアスであってはいけないが、例外規定により「エイリアスになり得ると考慮すべき(コンパイラ視点)」「エイリアスを作っても良い(プログラマ視点)」という意味です。
22
22
 
23
23
 
24
24
 
@@ -53,8 +53,6 @@
53
53
  }
54
54
 
55
55
  ```
56
-
57
-
58
56
 
59
57
 
60
58
 
@@ -100,7 +98,7 @@
100
98
 
101
99
  S t = { 3.14, 42 };
102
100
 
103
- s = t;
101
+ *s = t;
104
102
 
105
103
  // つまり下記処理では改めてメモリ位置*aから値を読み込まなければならない。
106
104
 
@@ -126,4 +124,4 @@
126
124
 
127
125
 
128
126
 
129
- 善意的に解釈すればプログラマに優しく、悪意を持って解釈すれば性能が劣るコンパイラということになります。しかし、"Strict Aliasing Rules"を厳密に守っているプログラムはほとんど存在せず(たぶん)、積極的な最適化はしばしばトラブルの元になります。C言語仕様で規定する以上「Cコンパイラが正しくプログラムが誤っている」のですが、現実的には"Strict Aliasing Rules"に基づいた最適化を無効化して運用されることが多いようです。
127
+ 善意的に解釈すればプログラマに優しく、悪意を持って解釈すれば最適化性能が劣るコンパイラということになります。しかし、"Strict Aliasing Rules"を厳密に守っているプログラムはほとんど存在せず(たぶん)、積極的な最適化はしばしばトラブルの元になります。C言語仕様で規定する以上「Cコンパイラが正しくプログラムが誤っている」のですが、現実的には"Strict Aliasing Rules"に基づいた最適化を無効化して運用されることが多いようです。GCC、Clangでは`-fno-strict-aliasing`オプションが用いられます。

2

refine

2018/08/29 02:09

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -78,7 +78,7 @@
78
78
 
79
79
  ```c
80
80
 
81
- // int型を含む集成体型は...
81
+ // int型を含む集成体(struct)型は...
82
82
 
83
83
  struct S {
84
84
 
@@ -96,9 +96,11 @@
96
96
 
97
97
  *a = 0;
98
98
 
99
- // 下記の処理*a書き換わる可能性がある...
99
+ // 下記の処理によりメモリ位置*a書き換わる可能性がある
100
100
 
101
+ S t = { 3.14, 42 };
102
+
101
- s->i = 42;
103
+ s = t;
102
104
 
103
105
  // つまり下記処理では改めてメモリ位置*aから値を読み込まなければならない。
104
106
 

1

update

2018/08/28 17:00

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -48,7 +48,7 @@
48
48
 
49
49
  printf("%d", *a);
50
50
 
51
- // つまり↑をprintf("%d", 0);やprintf("0");に最適化しても良い。
51
+ // コンパイラは↑をprintf("%d", 0);やprintf("0");に最適化しても良い。
52
52
 
53
53
  }
54
54
 
@@ -107,3 +107,21 @@
107
107
  }
108
108
 
109
109
  ```
110
+
111
+
112
+
113
+ ----
114
+
115
+
116
+
117
+ > visual studio C++ が strict aliasing rules をサポートしているのかについて調査をしてみたのですが、そのようなものは見つかりませんでした。
118
+
119
+ > もしかしたらそもそもサポートしていないのではないのかと思いました。
120
+
121
+
122
+
123
+ コンパイラが"Strict Aliasing Rules"をサポートするとは、前掲のように「型情報に基づいた積極的コード生成最適化を行う」という意味です。最新のVisualC++事情までは把握していませんが、私が知る限りはVisual C++はこのような積極的な**最適化を行いません**。なお、GCCやClangは積極的な最適化をサポートします。
124
+
125
+
126
+
127
+ 善意的に解釈すればプログラマに優しく、悪意を持って解釈すれば性能が劣るコンパイラということになります。しかし、"Strict Aliasing Rules"を厳密に守っているプログラムはほとんど存在せず(たぶん)、積極的な最適化はしばしばトラブルの元になります。C言語仕様で規定する以上「Cコンパイラが正しくプログラムが誤っている」のですが、現実的には"Strict Aliasing Rules"に基づいた最適化を無効化して運用されることが多いようです。