2011-12-19 17 views
13

これはヘッダーファイルで宣言され:アクセサーをインライン化する必要がありますか?

class PrimeSieve 
{ 
    populate(int lim); 
    vector<int> sieve; 
    long long limit; 

    public: 
     unsigned int limit(); 
}; 

Iは、インライン、.cppファイルまたは.Hにアクセッサメソッドを定義する必要がありますか?

私はC++を使い慣れていませんが、ベストプラクティスに従いたいと思います。私はいくつかの本の中でこれを見てきました - これは標準と見なされていますか?

unsigned int limit() { return limit; }; 
+1

これはおそらく「合理的に短い関数をインライン化すべきか」と考えられるでしょう。 –

+4

あなたは 'const'、btwがありません。 –

+0

関数をインラインで定義することはできますが、ヘッダーファイル内ではあるがクラス本体の外側に定義することができます。これにより、より読みやすいインターフェースが得られることがあります。あなたのケースでは、クラス宣言を「行外」と同じように保ちますが、その前に 'inline'を付けて関数定義をヘッダーファイルに移動します。 –

答えて

11

確実にアクセサーをヘッダファイルに書き込みます。それはより良い最適化を可能にし、カプセル化を減らさない(プライベートデータのフォーマットを変更すると、ヘッダーを含むすべてのユニットを再コンパイルする必要があるため)。

複雑なアルゴリズムの場合、実装ファイルで定義を非表示にしたい場合があります。また、クラス定義で必要とされないいくつかの型/ヘッダファイルが実装に必要な場合。これらのケースはどちらもシンプルなアクセサには当てはまりません。

1ライナーの場合は、クラス定義内に配置します。わずかに長いメンバ関数はヘッダーファイルに残るはずですが、クラス定義に続いて明示的にinlineと宣言される可能性があります。

+1

インラインメソッドがたくさんある場合、それらを ".inl "ファイルとスティック#MyClass.hの下にある" MyClass.inl "をインクルードして、私のヘッダーファイルが少しでも清潔に保たれるようにします(MyClassのクライアントはインラインメソッドであっても実装の詳細を知る必要はありません)。 – franji1

7

ほとんどの新しいコンパイラは、必要なものをインライン化し、他のすべてをそのまま残しておくほどスマートです。だから、コンパイラには何が良いのかをさせて、もう一度それを推測しようとしないでください。

すべてのコードを.cppに、コードの宣言を.hに入れます。

+0

"定義"とは "宣言"を意味します。そして。 。 。あなたの答えは本当に私にとって意味をなさない。メソッドの実装を.cppファイルに入れている場合、コンパイラーは他の.cppファイルでそのインライン化をインライン化する方法を考えていますか? – ruakh

+1

Re:定義と宣言:まったくありません!これはC++の本当に重要な違いです。あなたが "コード"と呼んでいるのは実際には "定義"であり、 "コード定義"と呼ばれるのは実際には "宣言"です。再:リンク時の最適化:知ってよかった、ありがとう! (私はこれまで削除していた私の以前のコメントには申し訳なく思っていたが、振り返ってみると、私はそれを馬鹿げた言葉にしていたと思う。私は申し訳ありません。) – ruakh

+1

@ GregorBrandt:C++ - LTOは最先端のコンパイラ技術ですが、実稼働環境で使用されている多くのコンパイラは出血していません。また、LTOサポートは通常明示的に要求されなければならないことを知っていますか、コンパイラが自動的にすべてをサポートすることを期待していますか? –

-1

グローバルなプログラミング標準よりも、組織によって異なります。もちろん、getLimit()は単なるlimit()よりも優れています。

+2

'getLimit'は正規のC++スタイルではありません。 –

+2

あなたは自分自身と矛盾していませんか?コーディング標準として、組織によって異なるとし、これはあまりにもコーディング標準であるにもかかわらず、 'getLimit'が' limit'よりも優れていると主張していますか? –

+0

しかし、それは単なる 'limit()'よりはるかにはっきりしています。標準よりも優れているものがあります。 – check123

0

大まかに言えば、すべてのコードを.cppファイルに入れることです。これは、.hファイル内のインライン関数に反対します。

0

クラスのクライアントに完全に見えるクラスの単純なデータ型の場合、クラス定義が変更されるたびにクライアントを再コンパイルする必要があるため、実際の違いはありません。

メンバを直接使用するのではなくアクセサを作成する主な理由は、後でデータメンバを削除してもインターフェイスを互換性を保つように実装することです。アクセサを含むインターフェイスが変更されていない場合、結果は通常バイナリ互換です。そうでない場合は、ソース互換です。アクセサをインラインにするということは、変更するインターフェイスの一部としてそれを定義することを意味します。したがって、ソースとの互換性のみが可能です。

アクセッサを持つもう一つの理由は、DLLの境界です。アクセッサが別の関数を呼び出す必要があり、その関数をインライン化できるようにするには、この関数のシンボルをクライアントにエクスポートする必要があります。

プロジェクトの複雑さにもよりますが、コードのインターフェイスを抽象クラスとして定義すると、クライアントが変更を見たことなく実装を心のコンテンツに変更できるようになります。この場合、アクセサはインターフェイスクラス内で抽象クラスとして定義され、クライアントはインライン展開できません。

0

アクセッサを宣言するための引数は、コールのオーバーヘッドを排除し、さらにいくつかの最適化を有効にすることができます。

私が経験したのパフォーマンスはで、通常はやや控えめです。その結果、私はもはやデフォルトでそれをやりません。

関連する問題