次のフリー関数は、C++で暗黙的にインライン化されていますか?クラス定義で定義されている場合、メンバー関数が暗黙的にインライン化される方法と似ていますか?C++で前の宣言なしで定義されていると、フリー関数が暗黙的にインライン化されますか?
void func() { ... }
テンプレート関数は同じように動作しますか?
次のフリー関数は、C++で暗黙的にインライン化されていますか?クラス定義で定義されている場合、メンバー関数が暗黙的にインライン化される方法と似ていますか?C++で前の宣言なしで定義されていると、フリー関数が暗黙的にインライン化されますか?
void func() { ... }
テンプレート関数は同じように動作しますか?
いいえ、暗黙のうちにインライン化されていません。コンパイラーは、別のモジュールがこの関数を使用するかどうかを知る方法がないため、その関数をコードで生成する必要があります。
たとえば、ヘッダーにそのような関数を定義し、ヘッダーを2回インクルードすると、複数の定義に関するリンカーエラーが発生することを意味します。明示的にinline
が修正されました。
もちろん、効率的だと思うならば、コンパイラはインラインで関数をインライン化できますが、明示的なインライン展開と同じではありません。
テンプレート関数は、多重定義エラーを防ぐためにinline
を必要としないという意味で、暗黙的にインライン展開されています。コンパイラがそれらをインライン展開することを余儀なくされたとは思わないが、わからない。
コンパイラがインライン化するかどうかによってインライン展開される場合があります。
インラインで何を意味するかによって異なります。コンパイラは、発信されたコードをコールサイトにインラインで配置することによって、あらゆる機能を最適化できます。
inline void func() { ... }
はその後、答えはノーである。しかし、あなたが意味する場合は、それが宣言されたかのように振る舞いについて尋ねるコードを行います。 2つの異なるコンパイル単位にコードを置き、実行可能ファイルをビルドすると、複数の定義エラーが発生します。関数を明示的に "インライン"としてマークした場合、その関数は表示されません。
テンプレート関数に関して、コンパイルシステムのある部分では、同じテンプレートの複数のインスタンス化によって複数の定義エラーが発生しないことがわかります。
.cppファイル内の "inline void func(){...}"は、 "static void func(){...}"と同じですが、適切なインライン化オプションがコンパイラが有効になっていますか? –
インライン関数をexternとして宣言することは可能です(少なくともg ++では可能ですが、静的には不可能です)。私はこれを標準的なトロールをするために他の誰かに任せています - ロンドンではあまりにも暑いです。 –
externインライン機能を持つことは絶対に可能です。実際には、標準で明示的に言及されています: "externインライン関数のstaticローカル変数は常に が同じオブジェクトを参照します。externインライン関数の文字列リテラルは、異なる翻訳単位で同じオブジェクトです。 – Doug
コンパイラは、最適化のみであるため、何もインライン展開することはありません。プログラムがその違いを知る方法はありません。 – curiousguy