C++对象实例成员函数内存表示
C++ object instance member function memory representation
C++中的成员函数在内存中究竟是如何表示的?我理解的功能基本上分为三类:
-静态:这些表示为任何其他全局函数
-Virtual:这些可以在 运行-time 期间通过 vtable 访问,以执行动态调度。
-Non-static and Non-virtual:我这里有麻烦了。大多数文章或解释都说,它们只是在代码中以与普通函数相同的方式表示,唯一的区别是它们期望一个隐藏的 "this" 指针作为参数,以便能够访问实例。但是,我不太确定这是怎么回事 represented/implemented。例如,如果我有:
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()
将被编译器 'replaced' 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.
的形式
C++中的成员函数在内存中究竟是如何表示的?我理解的功能基本上分为三类:
-静态:这些表示为任何其他全局函数
-Virtual:这些可以在 运行-time 期间通过 vtable 访问,以执行动态调度。
-Non-static and Non-virtual:我这里有麻烦了。大多数文章或解释都说,它们只是在代码中以与普通函数相同的方式表示,唯一的区别是它们期望一个隐藏的 "this" 指针作为参数,以便能够访问实例。但是,我不太确定这是怎么回事 represented/implemented。例如,如果我有:
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()
将被编译器 'replaced' 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.
的形式