2012-05-11 18 views
2

は、クラスCに2つの類似したC++のメンバ関数のこの例を考えてみましょう:"this->"を使用するとパフォーマンスが低下しますか?

void C::function(Foo new_f) { 
    f = new_f; 
} 

void C::function(Foo new_f) { 
    this->f = new_f; 
} 

は同じようにコンパイルされ、これらの機能はありますか? this->(より多くのメモリアクセスなど)を使用すると、パフォーマンス上の違反はありますか?

答えて

9

はい、まったく同じですが、同じパフォーマンスが得られます。

あなたが実際にを使用する必要があるのは、アクセスするインスタンス変数と同じ名前の関数への引数がある場合です。this->構文を使用する必要があります。変数の名前を単独で使用すると引数が参照されるので、this->が必要です。もちろん、引数の名前を変更することもできます。また、ildjarnがコメントにも指摘しているように、特定の状況でthisを使用する必要があります。これは、thisが暗黙的に依存しているためです(詳細は読むことができます)。

+3

「this->」が必要な他のコンテキストがあります。基本クラスメンバにアクセスするときに、クラステンプレートメンバ関数の内部 – ildjarn

+0

@ildjarn私はそれを知らなかった、あなたはどこでそれについて読むことができるか知っていますか? –

+0

[このFAQ](http://www.parashift.com/c++-faq/templates.html#faq-35.19)は表面を傷つけますが、SutterのExceptional C++シリーズで詳しく説明しています。 – ildjarn

2

これは略語です。この場合、まったく同じです。

3

コンパイラの観点からは、this->と暗黙的で明示的な違いはありません。

ただし、コードは主に人間の読者のために書かれていて、二次的にはコンパイラのために書かれていることを覚えておいてください。この観点から、this->を使用することは(本当に必要な数箇所を除いて)大きな損失であり、すべてのコードから消去する必要があります。

+0

あなたは "巨大な損失"であることを説明できますか – Scottymac

+2

@Scottymac:これは無関係なノイズで、無意味なコードの混乱を招き、効果的に読みにくくします。 – ildjarn

+0

私はめったに 'this->'を使うことはほとんどありませんが、私はそれを恐ろしいものとして見ません... "巨額の損失"はちょっとした過激さのようです...明瞭さと明瞭さはコードを読みやすくするために不可欠です... – Scottymac

0

コンパイラは、このポインタを知らずにこのポインタを使用します。あなたがそれを自分で打ち込むと、あなたはそれを明示していますが、(場合によっては)必要はありません。

0

2つの関数のアセンブリ出力を、GCCでフラグ-Sを指定してコンパイルすることで比較できます。これにより、入力C/C++ファイル用のシンボリックアセンブリコードが生成され、その2つは同一でなければなりません。

1

コンパイラはいずれにしてもメンバーにアクセスするためにthisを使用する必要があるため、結果のコードにはパフォーマンス上のペナルティはありません。私はここで停止し、this->ここでは必要とされているのはなぜ」と思うしなければならないので

ありは、私はコードを読み取るためのパフォーマンスペナルティですか?関与コーディングのトリックはありますか?私はこのクラスの重要な何かを見逃していましたか?または、コーダーは何も理由なくランダムにthis->を挿入しましたか? "

+0

コーディングトリックは、私はちょうどコンパイラの動作に興味がありました。また、setterメソッドの場合、インスタンス変数と同じ名前の関数引数を書き、それを区別するためにthis->を使用するのが好きです。そして、罰則はないので、私はそうするつもりです:) –

関連する問題