2011-01-11 15 views

答えて

7

全く違いはありません。

2つの唯一の違いは、クラス内のメンバーが暗黙的にインラインとしてタグ付けされていることです。しかし、これは本当の意味はありません。

参照してください:inline and good practices

ドキュメントはインラインタグはメソッドがインライン化されるべきであること(開発者)コンパイラへのヒントであることを述べています。すべての現代のコンパイラはこのヒントを無視し、メソッドがインライン化されるべきときを判断する内部ヒューリスティックを使用します(人間は悪名高く悪化しています)。

インラインのもう1つの使用法は、メソッドの複数の定義を見ることが期待されるかもしれないことをリンカーに伝えることです。関数定義がヘッダファイル内にある場合、ヘッダファイルを取得する各コンパイルユニットは関数の定義を持ちます(インライン化されていないと仮定します)。通常、これによりリンカーはエラーを生成します。インラインタグでは、コンパイラは複数の定義がある理由を理解し、アプリケーション以外のものはすべて削除します。

プロセスのインライン化に関する注意:メソッドは、インライン化するためにヘッダーファイル内にある必要はありません。現代のコンパイラは、異なるコンパイル単位でコンパイルされていても、すべての関数がインライン展開の対象となる完全なアプリケーション最適化を処理します。インラインフラグは一般に無視されるので、ヘッダーまたはソースファイルにメソッドを置くと違いはありません。

+1

質問はabout * member *関数本体のクラス宣言であり、 'inline'キーワードに関するものではありません。 –

+0

@ Nikolai N Fetissov:なぜ私はインラインについて話しているのかを追加しました。 –

2

最初の、すなわちコール部位で展開するためにコンパイラを示唆し、暗黙inlineあります。

+4

これは赤い聴力です。ほとんどのコンパイラ(すべてのモダン)は提案を無視するため、フラグはほとんどインライン展開とは関係ありません。 –

+0

はい、言語全体が怪しいです:) –

+0

投票の前に読んでもらえますか? –

3

ここでは、インラインの単語とコンパイラのヒントは無視されます。関連性がないためです。

AとBの大きな違いは、異なるライブラリで使用される場合です。

Aの場合、ヘッダーを#includeすることができ、リンクする必要はありません。したがって、特別なリンケージなしで、さまざまなアプリケーション/ライブラリのこのクラスを使用できます。

Bの場合、B.cppが必要です。これは1つのライブラリ/アプリケーションにのみコンパイルする必要があります。このクラスを使用する必要がある他のライブラリまたはアプリケーションは、実際のコード本体を含むライブラリまたはアプリケーションとリンクする必要があります。あなたは、「エクスポート」またはライブラリ間で「インポート」として特にWindowsで、たとえばあなたがDLLIMPORT/DLLEXPORTを使用することができます(クラスをマークすると、GNUであなたは= 属性(可視性を使用することができますが必要になりますいくつかのセットアップ/実装で

"default"))

1

インラインのもの以外にも、class Bの定義と関数の定義の間に、より多くの定義を入れることができるという点で違いがあります。

たとえば、B.cppには、B.hppが含まれていないヘッダーファイルが含まれている可能性があります。これは、大きなプロジェクトのビルドプロセスと大きな違いがあります。

しかし、別々の翻訳単位がなくても、定義を分離することによって解決される循環依存性が時々あることがあります。例えば、関数は、Bが定義される前に前方宣言されたタイプのパラメーターをとり、関数が定義された時刻で定義されます。そのタイプがそれ自身の定義でBの定義を使用する場合、Bの前に定義することはできません。

関連する問題