c++对象实例成员函数的内存表示

C++ object instance member function memory representation

本文关键字:内存 表示 函数 成员 对象 实例 c++      更新时间:2023-10-16

c++中的成员函数是如何在内存中表示的?我知道基本上有三种类型的函数:

-Static:它们表示为任何其他全局函数

-Virtual:这些可以在运行时通过虚函数表访问,以便执行动态调度。

-非静态和非虚拟:我在这里遇到麻烦了。大多数文章或解释说,它们只是以与代码中的普通函数相同的方式表示,唯一的区别是它们期望一个隐藏的"this"指针作为参数,以便能够访问实例的数据。然而,我不太确定这是如何表示/实现的。例如,如果我有:

class A:
  int var_a;
  public:
   int get_member_var_a(){
    return var_a;
   }
   A(int init): var_a(init) {}
 A* instance_of_a = new A(4);
现在如果我调用
int tmp = instance_of_a->get_member_var_a();

对象A的实例是否有指向函数get_member_var_a的指针存储在内存中的某个地方,并且简单地调用该函数,同时传递一个实例指针作为额外的参数?

对于大多数实现来说,第二个假设可能是正确的。

int A::get_member_var_a()很可能会被编译成int __internal_compiler_prefix___A___get_member_var___thiscall(A* this)

所有a->fun()将被编译器'替换'为fun(a)

在实例中存储函数的地址开销太大(每个方法每个对象几个字节),因此甚至可能被标准禁止。

非静态非虚函数将被c++编译器拆分为"new"函数。此外,"new"函数的第一个形参将是"this"指针。

 instance_of_a->get_member_var_a();

编译器会将上面这行代码转换成如下格式:

mangled_function_name_for_get_member_var_a(这)

例如,编译器可能会将函数修改为_ZN1A16get_member_var_aEv。