1

割り当ての場合、出力を処理するための 2 つのメソッドを作成する必要があります。1 つは文字列の出力用で、もう 1 つは整数用です。

基本的に、別のメソッドを呼び出す 2 つのメソッドがあります。

void TheClass::displayString(string str){ cout << str; }
void TheClass::displayNumber(int n) { cout << n; }

インラインは、さらに別の関数を呼び出さないことでオーバーヘッドを節約することでスピードアップしますか、それとも cout の名前空間などに関してさらに作成しますか?

inline void TheClass::displayString(string str) { cout << str; }
inline void TheClass::displayNumber(int n) { cout << n; }
4

7 に答える 7

13

名前空間はそれとは何の関係もありません。

おそらく、1 つの単純な理由から、ここでは何のメリットも見られないでしょう。関数が非常に小さいため、コンパイラがとにかくインライン展開することを期待しているからです。

キーワードinlineはディレクティブではなくヒントであり、通常はツールチェーンにいつインライン化するかを決定させることができます。それが得意です。

于 2011-07-01T23:30:04.980 に答える
2

私は Tomalak に同意します。インラインはヒントにすぎず、関数をインライン化してもほとんどメリットはありません。今日のプロセッサは非常に高速であるため、もう 1 回関数を呼び出すことはまったく問題になりません。

inlineOpenGLプログラミングで関数を使用しました。OpenGL プログラムは無限ループです。ループをできるだけ速く実行するには、非常に効率的にプログラムする必要があります。これにより、ユーザーへの応答性が維持され、画像がスムーズに生成されます。一部の関数を宣言inlineすると、プログラムがより高速かつスムーズに実行されると信じていました。

結局のところ、この手法による大幅なパフォーマンスの向上は期待できません。おそらく、極端な場合でも実行時間が 1 ~ 2% 短縮されるだけです。

于 2011-07-01T23:53:01.987 に答える
1

このinlineキーワードは、生成されたコードのインライン化とはほとんど関係ありません。このinlineキーワードは、関数がインラインで宣言されている (つまり、その宣言で定義されている) ことを示しているため、複数のコンパイル単位で定義が重複している可能性があります。inlineこの関数定義は複数のコンパイル単位に含まれる可能性があり、キーワードがないとこれは 1 つの定義規則に違反するため、ヘッダーで関数を定義する場合に必要です。

パフォーマンスが気になる場合は、コードが何をしているのか知らない人にボトルネックがどこにあるのか推測するのではなく、実行中にコードをプロファイリングしてください。

于 2011-07-02T04:22:17.317 に答える
1

これら 2 つの関数を使用すると、コンパイラが関数をインライン展開するかどうかに関係なく、顕著な違いは見られないでしょう。

その理由は、ストリームの挿入 ( <<) がかなり遅いためです。1 つの単純な (インライン化されていない) 関数呼び出しよりもはるかに低速です。

そして、他の人がすでに指摘しているように、constへの参照によって文字列を渡すことに慣れる必要があります(およびコピーするのが本当に安くない他のオブジェクト)。

コピーが高価な場合でも(または特に)値渡しが望ましい場合があります(たとえば、operator =コピーとスワップを使用して実装する場合)。しかし、それらはまれであり、自分で何が適切かを判断できない限り、常に値で渡すよりも常に const への参照で渡す方がはるかに優れています。

于 2011-07-02T06:50:27.870 に答える
0

const-reference を持つように最適化する 1 つの方法:

void TheClass::displayString(cosnt string& str){ cout << str; }
于 2011-07-02T05:06:01.950 に答える
0

Softnux さん、単純にベンチマークを作成してみませんか? 100 万回の繰り返しでループを作成し、for各オプションにかかる時間を確認します。次に、デバッグ ビルドとリリース ビルドのベンチマークを個別に実行します。最新のコンパイラは、インライン化またはループ展開がより適切なオプションである場合を判断する必要があります。

編集:文字列ストリームで試してください。ここでは、関数呼び出し自体ではなく、コンソールへの出力がボトルネックになります。

于 2011-07-02T10:49:48.147 に答える
0

出力の生成に多くの時間を費やしていない場合は、とにかく問題になりません。プログラムのプロファイリングを行い、プログラムがほとんどの時間を出力の生成に費やしているという異常な状況にあると判断した場合は、このコードを高速化する方法を検討することができます。inline キーワードを追加してもおそらく高速化されないでしょう。コンパイラはおそらく既に関数をインライン展開しているからです。

実際にコードを高速化するための簡単な最初のステップは、代わりに文字列パラメーターを const string& にすることです。そうすれば、文字列をコピーしません。より複雑な 2 番目のステップは、C++ ストリームの代わりに C 出力 API を使用することです。私の経験では、C API ははるかに高速であり、それはここここにバックアップされています。ただし、プロファイリングに基づくパフォーマンスが実際に本当に必要であることが確実でない限り、C API に移行することはお勧めしません。

于 2011-07-02T04:11:06.123 に答える