2

クラス C の 2 つの同様の C++ メンバー関数の例を考えてみましょう。

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

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

これらの関数は同じ方法でコンパイルされていますか? 使用することによるパフォーマンスの低下はありますかthis->(より多くのメモリ アクセスなど)?

4

6 に答える 6

9

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

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

于 2012-05-11T23:22:27.853 に答える
3

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

ただし、コードは主に人間の読者向けに記述し、コンパイラー向けには二次的に記述する必要があることに注意してください。この観点からすると、this->(本当に必要ないくつかの場所を除いて) を使用することは大きな損失であり、すべてのコードから削除する必要があります。

于 2012-05-11T23:23:27.033 に答える
2

略記です。この場合、まったく同じです。

于 2012-05-11T23:22:23.970 に答える
1

thisコンパイラはとにかくメンバーにアクセスするために使用する必要があるため、結果のコードにパフォーマンスの低下はありません。

ここ停止して「なぜthis->ここが必要なのか?コーディングのトリックが含まれているのか?このクラスで重要なことを見逃したのか?それともコーダーが挿入しただけなのか?this->理由もなくランダム?」

于 2012-05-12T06:31:27.633 に答える
0

コンパイラは、ユーザーが知らないうちにこのポインターを使用します。自分で入力するときはいつでも、それを明示的に述べていますが、(場合によっては) その必要はありません。

于 2012-05-11T23:23:43.133 に答える
0

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

于 2012-05-12T01:22:53.837 に答える