web-dev-qa-db-ja.com

関数を選択的に(強制的に)インライン化できますか?

Clean Code (および私が遭遇して読んだ他のいくつか)では、関数を小さくし、大きくなった場合は関数を分割することをお勧めします。また、関数は1つの処理と1つの処理のみを実行する必要があることも示しています。

C++でのソフトウェアの最適化 で、Agner Fogは、関数が複数の行の特定のしきい値を超えたからといって、関数を分割するルールが好きではないと述べています。これにより、パフォーマンスが低下する不要なジャンプが発生すると述べています。

まず、私が取り組んでいるコードがタイトなループになくても問題ないことと、関数が重いため、関数を呼び出すのにかかる時間が、関数のコードが実行します。しかし、ほとんどの場合、他のオブジェクト/関数によって使用され、比較的簡単なタスクを実行している関数を使用していると仮定しましょう。これらの関数は、最初の段落にリストされている提案に従います(つまり、1つの単一の関数を実行し、小さい/わかりやすい)。次に、これらの他の関数をタイトループで利用する、本質的にフレーム関数であるパフォーマンスクリティカル関数のプログラミングを開始します。最後に、それらをインライン化すると、パフォーマンスが重要な機能にはメリットがありますが、他の機能にはまったくメリットがないと仮定します(そうです、私はこれをプロファイリングしましたが、多くのコピーと貼り付けは避けたいものです)。

すぐに、関数にinlineというタグを付けて、コンパイラーに選択させることができます。しかし、これらすべての関数を `。inlファイルに含めたり、ヘッダーに公開したりしたくない場合はどうなりますか?私の現在の状況では、パフォーマンスが重要な関数とそれが使用する他の関数はすべて同じソースファイルにあります。

まとめると、単一の関数の関数を選択的に(強制的に)インライン化して、他の関数を複数回呼び出すのではなく、1つの大きな関数のように終了コードが動作するようにできますか?.

27
Samaursa

インラインを強制することはできません。また、最近のCPUでの関数呼び出しは、行われる作業のコストに比べてかなり安価です。関数が分解する必要があるほど十分に大きい場合、呼び出しを実行するためにかかる追加の時間は本質的に何もありません。

それができない場合は、...マクロを使用してみてください。

11
Puppy

.cppファイルの静的関数にinlineを配置することを妨げるものはありません。

一部のコンパイラには、インライン関数を強制するオプションがあります。 GCC attribute((always_inline))とインライン最適化を微調整するための大量のオプション(-minline- *パラメータを参照)。

私の推奨は、inlineまたはより適切なstatic inlineを使用して、コンパイラーに決定させることです。彼らは通常それをかなりうまくやります。

16
rodrigo

いいえ、inlineはコンパイラに推奨です。それは何もすることを強制しません。また、MSVC++を使用している場合は、__forceinlineも誤称です。 inlineよりも強力な推奨事項です。

11
Jacob

これは、C++と同じくらい古き良き時代のストレートCに関するものです。速度とスペースの両方を注意深く管理する必要がある組み込みの世界では、これが本当に問題になる可能性があるので、先日私はこれについて考えていました。メモリは安価なデスクトップ/サーバー開発で普及しています)。

可能私がまだ精査していない解決策は、基本的に、次のような異なるバリアントに2つの名前を使用することです

inline int _max(int a, int b) {
    return a > b ? a : b;
}

その後

int max(int a, int b) {
    return _max(a, b);
}

これにより、_max()またはmax()を選択的に呼び出すことができるようになりますが、アルゴリズムは一度だけ定義されます。

7
Travis Griggs

コンパイラーは、最適化されたコードを生成するのに本当に優れています。

コードを論理グループに編成し(読みやすさが向上している場合は追加の関数を使用)、必要に応じてインラインでマークし、コンパイラーに最適に生成するコードを決定させることをお勧めします。

1
Mark B

インライン化–たとえば、関数Bを頻繁に呼び出す関数Aが存在し、関数Bが比較的小さい場合、プロファイルに基づく最適化は関数をインライン化します関数AのB。

VSプロファイルに基づく最適化

Performance and Diagnostics Hubの自動化されたプロファイルガイド付き最適化for Visual C++プラグインを使用して、Visual Studio内の最適化プロセスを簡素化および合理化するか、Visual Studioまたはコマンドラインで手動で最適化手順を実行できます。 プラグインは使いやすいのでお勧めします。プラグインを入手して、アプリを最適化するために使用する方法については、 プロファイルガイド付き最適化プラグイン

1
deeznutts