2013-01-09 3 views
10

オペレータとC++でインライン化するための他の方法に違いはありますか? 私はそれを検索しましたが、私が見ているような一般的な質問ではありません。 誰にもそれを使用したり避けたりする強い理由がありますか? 注:明らかに、私はインライン演算子が小さいときはそれを意味します。インライン演算子は良いですか?

+4

まあインライン化あなたはコンパイラ固有のものを使用しない限り、あなた次第しかしコンパイラにはありません。だからC + +の答えは:問題ではない、それを制御することはできません。 – GManNickG

+0

@GManNickG:コメントの代わりに答えが必要です! –

+1

@ K-ballo:それは、 'inline'キーワードが実際にインライン化とmehを制御しない方法を説明するのに努力します。私は怠け者になってしまいました。 :) – GManNickG

答えて

11

このコンパイラ間で異なる可能性がありますが、私は、コンパイラの視点から、オペレータは、ソースコードの構文は少し違って見えることを可能にする、やや変わった名前を持つだけで、別の関数であることを期待したいです。

コンパイラのコードジェネレータ部分が実行されるまでに、オーバーロードされた演算子と(同じことをした)別の関数の間の相違が消滅すると思います。

このように、inlineと宣言したり、クラス定義の本体内に定義したりすると、他の関数と同じようにオペレータの負担がかかります(ごくわずかです)。ほとんどの場合、最適化が有効になっていると、ほとんどのコンパイラはinlineキーワードを無視して、インライン展開する方法について独自の決定をしています。 。

コンパイラはinlineキーワードを無視できないことに注意してください。関数が実際にインライン展開されているかどうかにかかわらず、「1つの定義ルール」に特別な変更が加えられています。

+2

演算子のオーバーロード**はちょうど別の関数です。違いはありません。 –

+2

@ K-ballo:標準の観点から、あなたははっきりと正しいです。私は*コンパイラの観点からも正しいと期待していますが、コンパイラは、何かが演算子のオーバーロードであるかどうかに基づいてインライン展開について異なるルールを適用できます(実際には驚くかもしれませんが) 。 –

+0

コンパイラは、関数が受け付ける引数の数や、その名前が特定のパターンと一致するかどうかなど、他の条件に応じて、インライン化について異なる規則を適用することもできます。オーバーロードされた演算子は、それに関して特別なものではありません。 – Wyzard

5

inlineキーワードをに、を使用して、関数をインライン化するようにコンパイラに提案することができます。

コンパイラはこの要求に従う義務を負いません。

演算子は類似しています - それらはインライン展開されている場合とされていない場合があります。

コンパイラは強制的にインライン化できないため、インライン化ヒントの使用や使用を避ける理由はおそらくありません。それがすべてです。ヒント。

Visual C++では、__forceinlineキーワードを使用して強制的にインライン展開すると、コードが大きくなり、パフォーマンスが低下する可能性があります。うまく設計されたシステムでは、オプションを削除すると(たいていは強制的に)パフォーマンスが低下することがよくあります。このキーワードを使用しても、すべての関数が正常にインライン化されるわけではありません。

GCCインライン化については、hereを参照してください。

+2

"結果はコードが大きくなり、パフォーマンスが低下する可能性があります" [またはコードが小さくなる可能性があります。またはより速い](http://www.parashift.com/c++-faq/inline-and-perf.html)(私はリンクされたページが誤って 'inline'としてマークされたインライン関数を常にコンパイラに仮定します) –

2

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); } 
}; 
関連する問題