ほとんどの人は、クラスメンバーがこのポインタを関数の最初の "見えない"パラメータとして受け取ることを知っています。 これはC++標準で指定されていますか?特定のコンパイラの実装が別の方法でそれを渡すことはできますか?たとえば専用のレジストリ。C++標準では、このポインタをメンバ関数に渡す方法を指定していますか?
答えて
C++の最初のバージョンがどのように実装されていたのですか(初期のC++はCコードに変換されました)が、ではなくがこれを実行することが保証されています。
最後のパラメータ値として渡すことも可能であるように見えますが、仮想関数ではいくつかの異なるテクニックがすべて可能です。
誰かが最初のパラメータとして 'this'を渡していないコンパイラを知っていますか? – AndyG
@AndyG MSVC。 ['__thiscall'呼び出し規約](https://msdn.microsoft.com/en-us/library/ek8tkfbw.aspx)はECXレジスタに' this'を渡し、引数はスタックに渡します。 –
'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つを取得しません。 –
- 1. C++メンバ関数ポインタを別のクラスに渡すには?ここ
- 2. メンバ関数を関数ポインタに渡す
- 3. C標準のtime()関数はNULLパラメータを指定してもスレッドセーフですか?
- 4. C++のグローバル関数でメンバ関数を指す方法は?
- 5. C++で引数としてメンバ関数へのポインタを渡します。
- 6. C++ | funcポインタとしてメンバ関数を使用する方法
- 7. 非メンバ関数ポインタが必要なときにメンバ関数ポインタを渡す?
- 8. C++メンバ関数ポインタ
- 9. C++メンバ関数ポインタの定義
- 10. C標準 - 関数定義は関数プロトタイプですか?
- 11. メンバ関数ポインタが別のオブジェクトのメソッドを指している
- 12. メンバ関数C++のポインタ
- 13. ライブラリのJNI関数にC++関数ポインタを渡す方法
- 14. 関数内のポインタとして構造体メンバを渡す方法
- 15. objective-C++から標準C++に関数を渡す方法はありますか?
- 16. C++メンバ関数へのポインタ、メンバ
- 17. メンバ関数へのポインタを返すメンバ関数の作成方法は?
- 18. C/C++ 1つの関数呼び出しでconst関数ポインタまたは単純ポインタを渡す方法
- 19. C++のメンバ関数への関数ポインタ
- 20. psych :: describe関数の標準エラー - それは何を指していますか?
- 21. オーバーロードされたメンバ関数の関数ポインタを渡しますか?
- 22. 関数へのポインタとしてのメンバ関数へのポインタの受け渡し
- 23. Cは、と私は、ポインタを使用してstrlen関数の標準的な実装を見ているポインタ
- 24. 関数のメンバを持つstructポインタを正しく渡す方法
- 25. C++でこのメンバ関数を呼び出す方法は?
- 26. メンバ関数をメンバ関数のパラメータとして渡す
- 27. Cで定義されている関数ポインタ/法律で追加のパラメータを渡していますか?
- 28. C++:ポインタを介してメンバ関数を呼び出す
- 29. MSVCでメンバ関数ポインタを取得する方法は?
- 30. CSS標準で関数が定義されていますか?
標準は登録者については何も知らない。それらは無関係な実装の詳細である。規格は、準拠しているプログラムが生成しなければならない観察可能な副作用のみを指定します。実装は、それらの副作用を達成するのが何であれ喜んで行うことができます。参照:http://en.cppreference.com/w/cpp/language/as_if –
引数(暗黙の 'this'引数を含む)がどのように渡されるかは、言語標準ではなく、プラットフォームABIの問題です。最新のABIでは、ほとんどの引数はCPUレジスタに渡されます。 –
これは、呼び出し規約によって確実に指示されます。これは明示的に指定することができるので、コンパイラは 'cdecl'をデフォルトと考えたり、指定したものを使用します。 – lfgtm