了解程序集中的对象存储 (x86)
在 x86 程序集中,对象存储为连续的内存块。它们并不像高级语言那样与类本质上相关;相反,它们只是可以由程序操作的字节段。
结构体和类存储
结构体和类的存储方式相同,除了带有虚拟成员有一个隐式“vtable”添加为第一个元素。该虚函数表包含指向每个虚函数实现的指针,允许动态绑定。
成员函数访问
成员函数通过隐式“this”指针访问,即作为第一个参数传递给函数。该指针指向正在访问其成员的对象。
虚拟函数调度
当调用虚拟函数时,编译器会检查对象的 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
In在此代码中,隐式“this”指针在 rdi 寄存器中传递,并且值在对象内以 4 个字节间隔存储,由编译器确定。
以上是x86 程序集中如何存储和访问对象?的详细内容。更多信息请关注PHP中文网其他相关文章!