C++ コンパイラは、すべてのメンバー メソッドに対して非表示の「this」ポインターを生成しますか?それとも、メンバーを参照するメソッドに対してのみ生成しますか?
5 に答える
簡単な答え: はい。
より長い答え:まあ、メンバー変数を使用していない場合、そもそもなぜそれがメンバー関数になるのでしょうか[静的メンバー関数ではありません]。(はい、インターフェイスがメンバーのコンテンツに対して何もしないメンバー メソッドを提供する場合があるかもしれません。これは、この関数を間違った型で呼び出した場合にエラー メッセージを出力するようなことを行っているためです。これは時々機能します」、そして何もする必要がない場合、それは空の機能です)。
コンパイラが実際に何をするかを知らなくてもメンバー関数を使用できるため (たとえば、関数の「使用」と「定義」のための異なるソース ファイルの場合)、コンパイラはすべての呼び出しに対して同じ呼び出し規則に従わなければなりません (MUST)。 、this
ポインターが実際に必要かどうか。もちろん、コードがコンパイラに見える場合、関数をインライン化するか、これを許可する状況下でより良いコードを生成する最適化を行うことができます。しかし、コンパイラがそれ以上のことを知らない場合の「デフォルト」は、this
実際に必要かどうかに関係なく、関数に渡すことです。
C++ 標準 (ドラフト N3242) からの引用:
9.3.2 this ポインタ
1 非静的 (9.3) メンバー関数の本体で、キーワード this は、関数が呼び出されるオブジェクトのアドレスを値とする prvalue 式です。
これは、すべてのメンバー関数に存在することを意味すると思います。
「C++ コンパイラ」は、時空間の正確な時点で彼が誰であるかに応じて、まったく異なる動作をする可能性があります。
つまり、ほとんどのコンパイラがクラスとオブジェクトを実装する方法this
は、クラスのすべてのインスタンスの一部です。これは、オブジェクトの完全なスコープでアクセスできることを意味します。
C++ のすべてのオブジェクトは、このポインターと呼ばれるポインターを介して独自のアドレスにアクセスできます。ポインターは、すべてのメンバー関数に対する暗黙のパラメーターです。this
フレンド関数にはポインターがありませんthis
。メンバ関数のみがthis
ポインタを持ちます。
class Interval
{
public:
long GetTime()
{
//Code
}
void SetTime(long value)
{
//Code
}
}
このコードを書いたとします。コンパイラは this ポインタを自動的に追加します。そして、プログラムのコンパイラー記述コードを表示すると、それが表示されます。
コンパイラは次のように追加します。
void Interval::SetTime(Interval* this, long value)