c++对象实例成员函数的内存表示
C++ object instance member function memory representation
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。
相关文章:
- 内存效率表示最短路径的方法?
- 内存中的长长类型表示形式
- 将两位数字转换为低内存表示的最快方法
- read() 上的不同行为取决于写入不可写内存时表示文件、匿名管道或套接字的文件描述符
- 指针内存表示和继承铸造
- 如何在计算机内存中打印长双重表示的二进制表示
- 尝试读取或写入受保护的内存.这通常表示其他内存已损坏.在C++Dll中
- DB表的内存表示形式的容器
- 如何从文件表示构建内存中的树
- 已尝试读取或写入受保护的内存.这通常表示其他内存已损坏 DllImport
- 内存中一个像素图像数据的表示形式
- 布尔值在内存中是如何表示的
- 标准::表示 2D 数据的矢量中的内存泄漏
- 内存地址的数字表示和对齐之间的关系
- 表示一个地址需要多少内存
- C++.NET包装程序:试图读取或写入受保护的内存.这通常表示其他内存已损坏
- 指向单链表中没有变量表示每个元素的内存地址的指针
- C++并集表示数据内存与C标量变量类型
- 间接操作符是否更改内存表示
- c++对象实例成员函数的内存表示