[解決済み] 関数/メソッドのキーワード 'inline' はいつ書けばよいのですか?
質問
キーワードはいつ書けばいいのでしょうか?
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)
. -
関数/メソッドに「インライン」と記述した場合、アプリケーションがマルチスレッドであるかどうかは重要でしょうか?
マルチスレッドはインライン化に何ら影響を与えません。
関連
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] noexceptを本当に使うべきはいつですか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】インライン関数を使用する場合と使用しない場合とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】'cout'は型名ではない
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++