オペレータとC++でインライン化するための他の方法に違いはありますか? 私はそれを検索しましたが、私が見ているような一般的な質問ではありません。 誰にもそれを使用したり避けたりする強い理由がありますか? 注:明らかに、私はインライン演算子が小さいときはそれを意味します。インライン演算子は良いですか?
答えて
このがコンパイラ間で異なる可能性がありますが、私は、コンパイラの視点から、オペレータは、ソースコードの構文は少し違って見えることを可能にする、やや変わった名前を持つだけで、別の関数であることを期待したいです。
コンパイラのコードジェネレータ部分が実行されるまでに、オーバーロードされた演算子と(同じことをした)別の関数の間の相違が消滅すると思います。
このように、inline
と宣言したり、クラス定義の本体内に定義したりすると、他の関数と同じようにオペレータの負担がかかります(ごくわずかです)。ほとんどの場合、最適化が有効になっていると、ほとんどのコンパイラはinline
キーワードを無視して、インライン展開する方法について独自の決定をしています。 。
コンパイラはinline
キーワードを無視できないことに注意してください。関数が実際にインライン展開されているかどうかにかかわらず、「1つの定義ルール」に特別な変更が加えられています。
演算子のオーバーロード**はちょうど別の関数です。違いはありません。 –
@ K-ballo:標準の観点から、あなたははっきりと正しいです。私は*コンパイラの観点からも正しいと期待していますが、コンパイラは、何かが演算子のオーバーロードであるかどうかに基づいてインライン展開について異なるルールを適用できます(実際には驚くかもしれませんが) 。 –
コンパイラは、関数が受け付ける引数の数や、その名前が特定のパターンと一致するかどうかなど、他の条件に応じて、インライン化について異なる規則を適用することもできます。オーバーロードされた演算子は、それに関して特別なものではありません。 – Wyzard
inline
キーワードをに、を使用して、関数をインライン化するようにコンパイラに提案することができます。
コンパイラはこの要求に従う義務を負いません。
演算子は類似しています - それらはインライン展開されている場合とされていない場合があります。
コンパイラは強制的にインライン化できないため、インライン化ヒントの使用や使用を避ける理由はおそらくありません。それがすべてです。ヒント。
Visual C++では、__forceinline
キーワードを使用して強制的にインライン展開すると、コードが大きくなり、パフォーマンスが低下する可能性があります。うまく設計されたシステムでは、オプションを削除すると(たいていは強制的に)パフォーマンスが低下することがよくあります。このキーワードを使用しても、すべての関数が正常にインライン化されるわけではありません。
GCCインライン化については、hereを参照してください。
"結果はコードが大きくなり、パフォーマンスが低下する可能性があります" [またはコードが小さくなる可能性があります。またはより速い](http://www.parashift.com/c++-faq/inline-and-perf.html)(私はリンクされたページが誤って 'inline'としてマークされたインライン関数を常にコンパイラに仮定します) –
inline
キーワードの使用法とコンパイラの最適化戦略に関して、コンパイラの「インライン」方法が通常あなたの代わりに使用されていない場合は、
もっと重要な点はヘッダーファイルの可読性で、operator
のメソッドは、簡単な変換を使用してそれらを構築することができます。このようなヘッダーファイルを調べなければならない場合は、論理的に関連する演算子メソッドのシグネチャのセットを一緒に見て、適用可能かどうかの概要を取得したいと思います。
非常に単純な例は、operator==()
とoperator!=()
の実装です:
class A
{
public:
// Equality tests
//-----------------------------------------------------------------------
// This may involve some mor complex code that'll look ugly here
bool operator==(const A& rhs) const;
// Fine, this is a one liner. Code appears 'inline' (and is likely to be
// chosen for inlining by the compiler, no matter if inline keyword or not)
bool operator!=(const A& rhs) const { return !A::operator==(rhs); }
};
- 1. 「インライン演算子T *()const」は何を意味しますか?
- 2. '='演算子をモーフィングと考える方が良いですか?
- 3. ":"演算子は代入演算子 "="と同等ですか?
- 4. ||演算子は=演算子と同じですか?
- 5. は、Invoke演算子&演算子はKotlin
- 6. 演算子( - - )()演算子C#
- 7. 演算子if演算子
- 8. VBScriptの+演算子と&演算子の違いは何ですか?
- 9. C++演算子はいつ実際にインライン化されますか?
- 10. C++演算子()括弧 - 演算子Type()vs型演算子()
- 11. オーバーロード比較です演算子「無効な演算子は、<」
- 12. 「演算子は[]」
- 13. * =演算子は
- 14. SASにはインライン関数または三項演算子がありますか?
- 15. 演算子のオーバーロード演算
- 16. C++演算子+演算子+ =オーバーロード
- 17. XOR演算子とstd :: ostream演算子
- 18. Xval演算子と比較演算子?
- 19. 共有ポインタ[]演算子と++演算子
- 20. Pythonのビット演算子 '&' 演算子
- 21. C++:演算子オーバーロード、演算子+
- 22. Java演算子 - > how ==演算子
- 23. ないキャストキャスト演算子は
- 24. Javaの* =演算子の演算子の優先順位は何ですか?
- 25. Cでのラムダ計算:ブール演算子とNOT演算子
- 26. この演算子は何ですか:&=
- 27. この演算子は何ですか、 "??"
- 28. は何ですか?:演算子
- 29. ()=>演算子とは何ですか?
- 30. JavaScriptの%演算子は何ですか?
まあインライン化あなたはコンパイラ固有のものを使用しない限り、あなた次第しかしコンパイラにはありません。だからC + +の答えは:問題ではない、それを制御することはできません。 – GManNickG
@GManNickG:コメントの代わりに答えが必要です! –
@ K-ballo:それは、 'inline'キーワードが実際にインライン化とmehを制御しない方法を説明するのに努力します。私は怠け者になってしまいました。 :) – GManNickG