今からでも遅くない練習作setterか、インラインセッター?
-
26-09-2019 - |
質問
public:
inline int GetValue() const {
return m_nValue;
}
inline void SetValue(int nNewValue) {
this -> m_nValue = nNewValue;
}
月 学びC++, っているという実行が速くなります。なので、いいと思っているのに使用setterか、セッター.かが課題を克るのですか?
解決
私はしませんインライン何でもします。
C ++コンパイラは、非常にスマートとあなたのためにこのようになる、ほぼ確実に、自動的にインラインこのような単純な機能です。そして、一般的にそれはあなたがあり、またはインライン化すべきではないべきかを決定することをはるかに良い仕事をするよりも賢いのです。
私は何にかをインラインやソリューションに焦点を当てることを考えて避けるだろう。 (ところで、インラインの保証されていない)、後inline
キーワードを追加するのはとても簡単で行うことですし、潜在的な場所は、プロファイラで容易に見つけることができます。
他のヒント
が、それらはデフォルトののことでinline
のと見なされます。
この手段、のないの彼らは実際、のインライン化のだろうということ。
これは、これらの機能へのパブリックAPIのすべての変更で悪い習慣は、すべてのクライアントの再コンパイルが必要とされます。
一般的にはにそれをしない、ゲッターとセッターが悪い抽象化を示している持ちます。 あなたは常にあなたが再あなたのクラスを配置する可能性が必要その後、別のクラスの生データに予定している場合、代わりにあなたはクラス内のデータを操作し、そうするための適切な方法を提供したい方法を検討します。
負のポイント:
のコンパイラは無視します。
変更にこれらの機能の再編簒ております。
良いコンパイラのインライン非inlined機能もあった。
私もあなたがフレームごとに取得する数百万/セットを実行している場合を除き、それはかなり無関係これらがインライン化されているかどうかということを追加したいと思います。それは正直の上に睡眠を失う価値はありません。
また、あなたが宣言+定義の前に単語「インライン」を置くという理由だけで、コンパイラはあなたのコードをインライン化するという意味ではありませんことを覚えておいてください。それは、多くの場合、サイズ対スピードのオフ古典的なトレードで感覚を作るかどうか動作するように使用されるさまざまな経験則です。ブルートフォース「__forceinline」キーワードは、コンパイラの空想の経験則にstomps VC ++(私はそれがGCCであるかわからないんだけど)、リースで、しかし、があります。私は本当にすべてでそれをお勧めしませんし、異なるアーキテクチャへのあなたのポートに一度のほかに、それはおそらく間違ったことでしょう。
ほとんどすべてのヘッダにある、その場合には、(コースの場合を除き、あなたしているテンプレートメタプログラミング(STL / BOOST /など)の実装ファイル内のすべての関数定義を配置しようとすると、ヘッダの純粋な宣言を残します;))
(私はから来たんだところで、少なくともビデオゲームでは、)インラインのような古典的な場所の人々の一つは、数学のヘッダです。クロス/製品、ベクトル長、マトリックスのクリアなどは、しばしば私は不要だと思うヘッダ、に配置されるドット。 9/10には、それがパフォーマンスに違いはない、とあなたは、このようないくつかの行列によって大きなベクター配列を変換すると、タイトなループを実行する必要がある場合は、手動で数学をインラインで行う、あるいはさらに良いでそれをコーディングおそらくより良いオフにしていますプラットフォーム固有のアセンブラます。
ああ、もう一つのポイントは、あなたが本当にコードよりも多くのデータとするクラスが必要と感じた場合、それはそこに何だそれを抽象化のOOの荷物を持っていない古き良き構造体を、使用することを検討してください。 :)
申し訳ありませんが、そんなに上に行くつもりが、私はちょうどそれが現実の世界のユースケースを検討するのに役立ちますと思うし、あまりにも杓子定規コンパイラの設定にハングアップを取得しないしませんでした(信託私を、私はそこにしてきました;))
幸運ます。
シェーン
のコードは、少し長いコンパイルされますし、カプセル化を失います。すべては、プロジェクトの規模とその性質に依存します。ほとんどの場合、それは彼らがどんな複雑なロジックを持っていない場合は、インラインそれらを作るためにOKです。
あなたはクラス定義に直接実装する場合はところで、あなたはinline
をスキップすることがあります。
ヘッダにコードを置くことによって、あなたの内部クラスの仕組みを露出させています。クライアントはこれを見てどのようにあなたのクラスの作品の仮定を行うことができます。これは、より困難なクライアントコードを壊すことなく、後で自分のクラスを変更するために作ることができます。
私はあなたがそれを気にする必要はないことを言うと思います。 のインライン化に関するよくある質問セクションをお読みください。
不要、少なくともこのような最適化のために、コンパイラを信頼開始しません!
"しかし常にではない"
inlineキーワードは、あなたのケース
で無意味です それができるとしたい場合は、はコンパイラに関係なくキーワードで、あなたの関数をインライン化されます。
キーワードのインラインは、リンクとインライン展開ではない影響を与えます。それは少し混乱ですが、それをよく読んでます。
の定義は、プロジェクト全体の最適化とリンク時コード生成が有効になっている場合にのみ可能となりますインライン化、コールとは異なるコンパイル単位(プリプロセッサの後に、ソースファイル、基本的に)である場合。大幅にそれを有効にする時間を(それが実際にので、リンカーのすべてを再コンパイル)リンク増大するが、明らかに性能を向上させることができます。わからないことはGCCとVSではデフォルトでオンまたはオフかどうます。
私はこのスレッドで他の人が持っているように見えるのはこの練習に強い嫌悪感を持っていない、と言うお奨め。私は、インライン化によるパフォーマンスゲインがすべてでは無視できる程度であるが、最も頻繁に例の使用に同意します。 (そして、はい、I のHAVE の実際にそのようなケースに遭遇しました。)私は、インライン化のこの種を行う場合には、私は便宜上、一般的にちょうどこのようなワンライナーのためにそれを行います。私のユースケースのほとんどでは、私が今までだけという強いではない、それらをクライアント側で回避の再コンパイルの必要性を変更する場合。
それは実装の配置によって暗示だとはい、あなたは、inline
をドロップすることができます。
また、私は少しはアクセサに対して激しさに驚きです。あなたはほとんどいくつかのダウンを吹き込むことなく、任意のオブジェクト指向言語のクラスでくしゃみをすることはできない、と彼らはインターフェースから抽象実装するすべての有効な手法の後なので、それは悪いOOの練習としてそれらを主張するビット自虐的です。 は無差別でない書き込みアクセサにの良いアドバイスそれをですが、私はまた、それらを根絶するために熱心に夢中にしないであなたをアドバイスします。
、純粋主義者のことを取ります。 : - )