アセンブリのオブジェクト ストレージ (x86) について
x86 アセンブリでは、オブジェクトはメモリの連続ブロックとして格納されます。これらは、高水準言語のように本質的にクラスに関連付けられていません。代わりに、それらはプログラムによって操作できる単なるバイトのセクションです。
構造体とクラスのストレージ
構造体とクラスは、クラスが仮想メンバーには、最初の要素として追加された暗黙的な「vtable」があります。この vtable には、各仮想関数の実装へのポインターが含まれており、動的バインディングが可能です。
メンバー関数アクセス
メンバー関数は、暗黙的な「this」ポインターを通じてアクセスされます。関数の最初の引数として渡されます。このポインタは、メンバーがアクセスされているオブジェクトを指します。
Virtual Function Dispatch
仮想関数が呼び出されると、コンパイラはオブジェクトの vtable をチェックして正しい値を決定します。関数の実装。この動的な動作により、さまざまな派生クラスが基本クラスの仮想関数をオーバーライドできる多態的な動作が可能になります。
レジスタの最適化
コンパイラは、構造体のメモリ割り当てを最適化することを選択する場合があります。 、特に小さな構造体やローカル変数の場合に適しています。構造体のメンバーを CPU レジスタに保持できるため、メモリ アクセスの必要がなくなります。
例
次のコードを考えてみましょう:
struct foo { int m_a; int m_b; void inc_a() { m_a++; } void inc_b() { m_b++; } };
inc_b 関数のアセンブリ コードは次のようになります。
foo::inc_b(): mov eax, DWORD PTR [rdi+4] # eax = this->m_b lea edx, [rax+1] # edx = eax+1 mov DWORD PTR [rdi+4], edx # this->m_b = edx ret
この例では、コードでは、暗黙的な「this」ポインタが rdi レジスタに渡され、値はコンパイラの決定に従ってオブジェクト内で 4 バイト離れて格納されます。
以上がx86 アセンブリではオブジェクトはどのように保存され、アクセスされるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。