コードのパフォーマンスを向上させるために、インライン関数を定義する必要があります。現在、関数の宣言は.hファイルにあり、定義は.cppファイルにあります。関数の各宣言の前にインラインキーワードを追加しましたが、リンクエラーが発生します。インライン関数の宣言と定義を分離することは可能ですか?
8 に答える
宣言と定義をうまく分離できますが、その定義は、関数を使用するすべての翻訳単位で使用できる必要があります。たとえば、次のようになります。
#include <iostream>
inline void foo();
int main() {
foo();
}
inline void foo() {
std::cout << "Hi\n";
}
完全に合法で正しいです。
n3290 § 7.1.2.4 からの正確な引用は次のとおりです。
インライン関数は、odr が使用されるすべての翻訳単位で定義され、すべての場合でまったく同じ定義を持つものとします (3.2)。[注: インライン関数の呼び出しは、その定義が翻訳単位に現れる前に発生する場合があります。—終わりのメモ]
§ 3.2 では、オーバーロードの解決など、どこでも同じでなければならないと基本的に述べています。
はい。ただし、ヘッダー ファイルに実装を配置する必要があります。これは、インライン化するには、ヘッダーを含めるときに定義を知っている必要があるためです。
そうする場合、最新のコンパイラは、inline
キーワードがなくても関数を自動的にインライン化します。
関数を「インライン」にするとパフォーマンスが向上すると確信していますか? 私はそれがないと確信しています。
コンパイラは、インライン化された関数の本体を認識できる場合にのみ、一部の関数呼び出しをインライン化できます。したがって、関数の本体も含める必要がありますが、そうする場合、コンパイラは関数の本体のみを必要とするため、関数に「インライン」で注釈を付ける必要はありません。「インライン」キーワードは必要ありません。最近のコンパイラはスマートで、関数をインライン化するかどうか、いつインライン化するかをヒントなしで認識しています。また、インライン化によって必ずしもプログラムのパフォーマンスが向上するわけではなく、実行可能ファイルのサイズが大きくなる可能性があります。
Herb Sutter によるこの記事を参照してください。彼は、「インライン」というキーワードは C++ では意味がないと主張しています。しかし、私は彼に同意しません。キーワード "inline" が 1 つの違いを生みます: プログラム内でインライン関数の本体を複数回指定できます (毎回まったく同じ定義である場合)。これは、関数本体をヘッダーに入れるときに役立ちます (必要な場合)。これは何らかの理由で)。
どこにでも含める別の「実装ヘッダー」を使用しますか?
プロトタイプまたは実現を一度だけ指定する必要があります。どちらも対象です。
定義上、インライン関数はコンパイル時に認識されている必要があります。それらを別の .h ファイルで定義する場合は、
#pragma once
定義を一度だけ挿入するトリック。