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

回答編集履歴

2

インライン!

2016/02/02 10:03

投稿

raccy
raccy

スコア21768

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

最後の文言を変更と補足追加

2016/02/02 10:03

投稿

raccy
raccy

スコア21768

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