2016-10-10 5 views
1

ほとんどの人は、クラスメンバーがこのポインタを関数の最初の "見えない"パラメータとして受け取ることを知っています。 これはC++標準で指定されていますか?特定のコンパイラの実装が別の方法でそれを渡すことはできますか?たとえば専用のレジストリ。C++標準では、このポインタをメンバ関数に渡す方法を指定していますか?

+3

標準は登録者については何も知らない。それらは無関係な実装の詳細である。規格は、準拠しているプログラムが生成しなければならない観察可能な副作用のみを指定します。実装は、それらの副作用を達成するのが何であれ喜んで行うことができます。参照:http://en.cppreference.com/w/cpp/language/as_if –

+1

引数(暗黙の 'this'引数を含む)がどのように渡されるかは、言語標準ではなく、プラットフォームABIの問題です。最新のABIでは、ほとんどの引数はCPUレジスタに渡されます。 –

+1

これは、呼び出し規約によって確実に指示されます。これは明示的に指定することができるので、コンパイラは 'cdecl'をデフォルトと考えたり、指定したものを使用します。 – lfgtm

答えて

4

C++の最初のバージョンがどのように実装されていたのですか(初期のC++はCコードに変換されました)が、ではなくがこれを実行することが保証されています。

最後のパラメータ値として渡すことも可能であるように見えますが、仮想関数ではいくつかの異なるテクニックがすべて可能です。

+0

誰かが最初のパラメータとして 'this'を渡していないコンパイラを知っていますか? – AndyG

+4

@AndyG MSVC。 ['__thiscall'呼び出し規約](https://msdn.microsoft.com/en-us/library/ek8tkfbw.aspx)はECXレジスタに' this'を渡し、引数はスタックに渡します。 –

+0

'virtual'関数は、少なくともいくつかのコンパイラ(MSVCなど)では、特定のバージョンの呼び出しを補助するためにadjustorのサンクを使用することがあります。クラスA、B、およびCが 'virtual void func()'を定義し、派生クラス 'ABC:public A、public B、public C'が' func() 'をオーバーライドすると、MSVCは2つのサンクを生成します: 'ABC :: B :: func()'が呼び出されたときに 'ABC'の' this'ポインタのアドレスを調整するものと、 'ABC :: C :: func()'が呼び出されたときに調整するもの。 (私のテストでは、 'A'は' ABC'のバイト0から始まり、したがってインスタンスの 'ABC * this'と' A * this'が同じアドレスを指しているので、 'A'は1つを取得しません。 –

関連する問題