回答編集履歴
2
インライン!
answer
CHANGED
@@ -38,4 +38,4 @@
|
|
38
38
|
|
39
39
|
---
|
40
40
|
補足
|
41
|
-
catsforepawさんの回答の例で言うと、C言語の+演算子が参照透過であることをC言語のコンパイラが知っていますので、aとbが変わらない(その範囲内でaとbが参照透過である)ことをコンパイラが判断できれば、最適化してくれます。ですが、C++
|
41
|
+
catsforepawさんの回答の例で言うと、C言語の+演算子が参照透過であることをC言語のコンパイラが知っていますので、aとbが変わらない(その範囲内でaとbが参照透過である)ことをコンパイラが判断できれば、最適化してくれます。ですが、C++のオーバーロードされた+演算子や他の一般的な関数では、インライン展開が出来るなどの条件が揃わないとその判断が困難ですので、やはり過信は禁物です。
|
1
最後の文言を変更と補足追加
answer
CHANGED
@@ -34,4 +34,8 @@
|
|
34
34
|
`plpl`は参照透過であり※、その引数も同じ3と5ですので、コンパイラは2回呼び出す必要は無いと判断し、1回の呼び出しだけで動作するようにしてくれました。そのため、`plpl`関数は1回しか呼び出されません。
|
35
35
|
※ デバッグ用の`trace`による副作用は無かった物として扱われます。
|
36
36
|
|
37
|
-
なお、ほとんどの言語では、定数を除き、変数や関数が参照透過であることをコンパイラが判断すること
|
37
|
+
なお、ほとんどの言語では、定数を除き、変数や関数が参照透過であることをコンパイラが判断することが難しいことがあります。そのため、上のような最適化はHaskellのような純粋関数型言語以外では過度の期待はできないでしょう。
|
38
|
+
|
39
|
+
---
|
40
|
+
補足
|
41
|
+
catsforepawさんの回答の例で言うと、C言語の+演算子が参照透過であることをC言語のコンパイラが知っていますので、aとbが変わらない(その範囲内でaとbが参照透過である)ことをコンパイラが判断できれば、最適化してくれます。ですが、C++だと+演算子はオーバーロードによりどうなるかわかりませんし、他の一般的な関数ではその判断はほぼ不可能ですので、やはり過信は禁物です。
|