9

コードのパフォーマンスを向上させるために、インライン関数を定義する必要があります。現在、関数の宣言は.hファイルにあり、定義は.cppファイルにあります。関数の各宣言の前にインラインキーワードを追加しましたが、リンクエラーが発生します。インライン関数の宣言と定義を分離することは可能ですか?

4

8 に答える 8

9

宣言と定義をうまく分離できますが、その定義は、関数を使用するすべての翻訳単位で使用できる必要があります。たとえば、次のようになります。

#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 では、オーバーロードの解決など、どこでも同じでなければならないと基本的に述べています。

于 2012-07-11T08:05:10.587 に答える
3

はい。ただし、ヘッダー ファイルに実装を配置する必要があります。これは、インライン化するには、ヘッダーを含めるときに定義を知っている必要があるためです。

そうする場合、最新のコンパイラは、inlineキーワードがなくても関数を自動的にインライン化します。

于 2012-07-11T08:05:07.587 に答える
3

関数を「インライン」にするとパフォーマンスが向上すると確信していますか? 私はそれがないと確信しています。

コンパイラは、インライン化された関数の本体を認識できる場合にのみ、一部の関数呼び出しをインライン化できます。したがって、関数の本体も含める必要がありますが、そうする場合、コンパイラは関数の本体のみを必要とするため、関数に「インライン」で注釈を付ける必要はありません。「インライン」キーワードは必要ありません。最近のコンパイラはスマートで、関数をインライン化するかどうか、いつインライン化するかをヒントなしで認識しています。また、インライン化によって必ずしもプログラムのパフォーマンスが向上するわけではなく、実行可能ファイルのサイズが大きくなる可能性があります。

Herb Sutter によるこの記事を参照してください。彼は、「インライン」というキーワードは C++ では意味がないと主張しています。しかし、私は彼に同意しません。キーワード "inline" が 1 つの違いを生みます: プログラム内でインライン関数の本体を複数回指定できます (毎回まったく同じ定義である場合)。これは、関数本体をヘッダーに入れるときに役立ちます (必要な場合)。これは何らかの理由で)。

于 2012-07-11T08:15:49.413 に答える
1

どこにでも含める別の「実装ヘッダー」を使用しますか?

于 2012-07-11T08:03:58.540 に答える
1

プロトタイプまたは実現を一度だけ指定する必要があります。どちらも対象です。

于 2012-07-11T08:04:36.453 に答える
1

定義上、インライン関数はコンパイル時に認識されている必要があります。それらを別の .h ファイルで定義する場合は、

#pragma once

定義を一度だけ挿入するトリック。

于 2012-07-11T08:04:42.803 に答える