1. ホーム
  2. c++

[解決済み] 関数/メソッドのキーワード 'inline' はいつ書けばよいのですか?

2022-03-15 12:56:40

質問

キーワードはいつ書けばいいのでしょうか? inline C++の関数/メソッドについて教えてください。

いくつかの回答を見てから、関連する質問をいくつか。

  • いつまでに ではなく C++で関数/メソッドにキーワード 'inline' を記述しますか?

  • コンパイラは、いつ関数/メソッドを'インライン'にするかわからなくなりますか?

  • アプリケーションは マルチスレッド 関数/メソッドに 'インライン' と書くとしたら?

どのように解決するのですか?

やれやれ、私の嫌いなものの一つだ。

inline は、どちらかというと static または extern は、関数をインライン化するようコンパイラに指示するディレクティブではありません。 extern , static , inline はリンケージ指示文であり、コンパイラではなくリンカがほぼ独占的に使用する。

と言われています。 inline は、この関数はインライン化するべきだということをコンパイラに示唆します。 1998年当時はそうだったかもしれませんが、10年後のコンパイラはそのようなヒントを必要としません。 言うまでもなく、コードの最適化に関して人間はたいてい間違っているので、ほとんどのコンパイラは「ヒント」を完全に無視する。

  • static - は、他の翻訳ユニットでは使用できません。 リンカーは、他の翻訳単位から静的に定義された変数/関数を誤って使用しないようにする必要があります。

  • extern - この変数/関数名はこの翻訳単位で使用しますが、定義されていなくても文句を言わないでください。 リンカはそれを整理して、ある外部シンボルを使おうとしたすべてのコードにそのアドレスがあることを確認するのです。

  • inline - この関数は複数の翻訳ユニットで定義されますが、気にしないでください。 リンカは、すべての翻訳ユニットが変数/関数の単一のインスタンスを使用することを確認する必要があります。

一般に、テンプレートの宣言は inline のリンクセマンティクスを持つので、無意味です。 inline を既に使用しています。しかし、テンプレートの明示的な特殊化とインスタンス化は を必要とします。 inline を使用します。


質問に対する具体的な回答

  • C++で関数/メソッドのキーワード「inline」はいつ書けばいいのでしょうか?

    その関数をヘッダで定義したい場合のみ。 より正確には、関数の定義が複数の翻訳ユニットで表示される可能性があるときだけです。 ヘッダーファイルで小さな(ワンライナーのような)関数を定義すると、コンパイラがコードを最適化する際に、より多くの情報を与えることができるからです。 また、コンパイル時間も長くなります。

  • <ブロッククオート

    C++で関数/メソッドにキーワード 'inline' を記述してはいけないのはどのような場合ですか?

    コンパイラがインライン化すればコードの実行速度が上がると思ったからと言って、インラインを追加しないでください。

  • <ブロッククオート

    コンパイラはいつになったら関数やメソッドを「インライン」にするのかわからなくなるのでしょうか?

    一般的には、コンパイラの方が上手にできるはずです。 しかし、コンパイラは、関数定義がない場合、コードをインライン化するオプションは持っていません。 最大限に最適化されたコードでは、通常、すべての private メソッドは、要求してもしなくてもインライン化されます。

    余談ですがGCCでインライン化を防ぐには __attribute__(( noinline )) を使用し、Visual Studio では __declspec(noinline) .

  • 関数/メソッドに「インライン」と記述した場合、アプリケーションがマルチスレッドであるかどうかは重要でしょうか?

    マルチスレッドはインライン化に何ら影響を与えません。