2017-06-08 2 views
-1

このコードのようなものは悪い習慣と考えられますか? もしそうなら、func1func2の動作と重複していて、私は両方の機能が必要です(これはコードの冗長性とは見なされません)。C++で複数レベルのインライン関数を書くのは良い考えですか?

UPD:私の悪いイラストに申し訳ありませんが、私は質問をより明確に説明しようとします。 2つのメソッドを大量に呼び出す最適化されたクラスを設計しようとしていますfunc1func2func1の実装ではfunc2が使用されています。したがって、func2func1からこのコードのように呼び出すか、両方を個別に実装する方が良いでしょう。

inline int func2(int x) { 
    return x * (x + 2); 
} 
inline int func1(int x) { 
    return x * (x + 1) * func2(x + 2); 
} 
+2

インライン関数が別のインライン関数を呼び出すことは悪い考えですか?なぜあなたはそれが悪い考えだと思いますか? –

+4

2つの機能が必要な場合、それは定義上冗長ではありません。それらが冗長であれば、2つの機能は必要ありません。 –

+2

この質問には非常に多くのことが間違っています。どこから始めたらいいのか分からない。 1)あなたのタイトルにはインライン関数が記述されています。 'inline'関数はどこにありますか? 2)「両方の機能が必要です」。待って? 3) 'func2'を複製する' func1() 'と言います。重複はどこですか? – Mysticial

答えて

4

同じコードを複数回書くことを避けると、いくつかの小さな関数を書くことは問題ありません。小さな関数が多すぎるとコードを読みにくくし、それは意見の問題だと主張する人もいます。

パフォーマンスが心配なら、問題があることを証明するまで、コンパイラはインラインで助けてくれると思いますが、心配する必要はありません。早すぎる最適化についてはthis questionを参照してください。

1

他の関数を呼び出す関数に問題はありません。実際のプログラムは、2つの呼び出しより深く処理されています。

インライン展開の場合でも問題ありません。最適化コンパイラは通常、func2をインラインします(定義が可視であり、最適化が有効であると仮定します)。多くの一般的なコンパイラとオプティマイザは、インライン展開に精通しています。彼らはしばしばインラインにするときとインラインにしないときを知っています。

小さな関数を書くことは悪いことではありません。クラリティとインテントは、通常、マイクロ最適化よりも重要です。典型的な状況下では、あなたの例に間違いはありません。

0

あなたのコードの可読性に役立つ場合は、はい。ほとんどの場合、コードの可読性を目指すべきです。他の人がその機能が何であるかを簡単に理解できるように、関数の名前を正しく指定することを忘れないでください。そして、他の人々によって私は数週間または数ヶ月であなたを意味します。あなたが言うように、コードを一度書くだけで何度も読むことができます。
パフォーマンスに関して、現代のコンパイラはいつ機能をインライン化するのかを知っています。あなたはそれについて心配するべきではありません。本当に重要な場合は、プロファイラーを使用してホストスポットを見つけて最終的に変更します。しかし、それはあなたが思うよりずっと少ない時間で起こります。ほとんどの場合、コードを最適化するためのより良い方法があります。

0

両方が同じスコープで実装されている場合、コンパイルではinlineなしで代数最適化を行うこともできます。以前はコンパイラが大規模で複雑な構造を目的関数の単純な呼び出し(d3d apiのためのある種の引数)で置き換えることになると、私は非常に驚いていました。だから、あなたがパフォーマンスについて心配するならば、ちょうど...少なくともあなたのアプリのベンチマークは本当に悪いです。

一方、func1が実際にはであり、func2に関連する論理的にの場合、func2をfunc1にコピーするほうが、コードの方が同じです。どうして? func2は変更される可能性がありますが、func1については忘れてしまい、内部ドメインロジックではないため、破損してしまいます。UPD


UPDすべての速度についてだけ数学が自分で、func1の中で書いているよりも、完全に式を最適化し、コンパイラに依存していない場合。しかし、パフォーマンスが第一位であることを本当に知っているならば。

関連する問題