4

私は、リアルタイム システムで使用される非常に複雑な C++ コードをいくつか持っているため、絶対に速度に敏感です。これは Linux で開発され、高速化するために多くの関数が「インライン」キーワードでマークされ、インライン化を可能にするためにヘッダー ファイルに移動されました。

このコードを Windows (msvc 10.0、Windows 7) に移植したところ、実行速度が約 30% 遅くなりました。いくつかのプロファイリングを行った後、問題は基本的に多くの関数がインライン化されていないことにあることがわかりました。代わりに「__forceinline」を使用すると、約 10 ~ 20% の速度向上が簡単にわかります。

誰かがこれについて説明していますか?msvc のアルゴリズムがはるかに保守的に機能するだけですか? それとも、構成オプションが欠落しているなど、何か間違ったことをしただけですか?

4

2 に答える 2

5

MSVC 最適化設定を確認する必要があります。

Project Properties -> C/C++ -> Optimization

"Favor size or speed"コンパイラが実行する準備ができているインライン化の量を大幅に変更するという設定があります。

于 2012-10-04T14:51:31.617 に答える
4

とはinline?

inlineメソッド定義がインラインで表示されることをコンパイラに通知するキーワードです。通常、メソッドは 1 つの TU (大まかに言えばソース ファイル) でのみ定義する必要があり、多くの異なる TU に含まれるヘッダーでメソッドを定義できるようにし、シンボルの重複inlineに関するコンパイラ/リンカーの苦情を回避します。リンカーはシンボルを適切にマージします。

ではない inlineものは何ですか?

inlineコンパイラが関数をインライン化するための命令では決してありません。歴史的にはそのように使用されていた可能性がありますが、オプティマイザーはいつインライン化するか (およびしないか) を決定する際にますます良くなっており、inline「ヒント」は今日ではほとんど効果がありません。

インライン化を強制する方法は?

コンパイラは通常、「さらに」インライン化を要求する特定のキーワード/属性を提供します。たとえば、MSVC では、メソッドをインライン化する必要があることを強く示唆し__forceinlineます(ただし、単に示唆するだけです)。

于 2012-10-04T14:55:12.463 に答える