クラス C の 2 つの同様の C++ メンバー関数の例を考えてみましょう。
void C::function(Foo new_f) {
f = new_f;
}
と
void C::function(Foo new_f) {
this->f = new_f;
}
これらの関数は同じ方法でコンパイルされていますか? 使用することによるパフォーマンスの低下はありますかthis->
(より多くのメモリ アクセスなど)?
クラス C の 2 つの同様の C++ メンバー関数の例を考えてみましょう。
void C::function(Foo new_f) {
f = new_f;
}
と
void C::function(Foo new_f) {
this->f = new_f;
}
これらの関数は同じ方法でコンパイルされていますか? 使用することによるパフォーマンスの低下はありますかthis->
(より多くのメモリ アクセスなど)?
はい、まったく同じで、同じパフォーマンスが得られます。
実際に構文を使用する必要this->
があるのは、アクセスするインスタンス変数と同じ名前の関数への引数がある場合だけです。変数の名前を単独で使用すると引数が参照されるため、this->
. もちろん、引数の名前を変更することもできます。また、ildjarn がコメントで指摘したようにthis
、特定の状況でthis
は、暗黙的に依存しているため、依存している関数を呼び出すために使用する必要があります (ただし、それについて詳しく読むことができます)。
コンパイラの観点からは、this->
暗黙的であることと明示的であることの間に違いはありません。
ただし、コードは主に人間の読者向けに記述し、コンパイラー向けには二次的に記述する必要があることに注意してください。この観点からすると、this->
(本当に必要ないくつかの場所を除いて) を使用することは大きな損失であり、すべてのコードから削除する必要があります。
略記です。この場合、まったく同じです。
this
コンパイラはとにかくメンバーにアクセスするために使用する必要があるため、結果のコードにパフォーマンスの低下はありません。
ここで停止して「なぜthis->
ここが必要なのか?コーディングのトリックが含まれているのか?このクラスで重要なことを見逃したのか?それともコーダーが挿入しただけなのか?this->
理由もなくランダム?」
コンパイラは、ユーザーが知らないうちにこのポインターを使用します。自分で入力するときはいつでも、それを明示的に述べていますが、(場合によっては) その必要はありません。
フラグ -S を使用して GCC でコンパイルすることにより、2 つの関数のアセンブリ出力を比較できます。これにより、入力 C/C++ ファイルのシンボリック アセンブリ コードが生成され、2 つのファイルは同一になります。