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

标签 c++ memory

C++中的成员函数在内存中究竟是如何表示的?我理解基本上有三种类型的功能:

-静态:这些表示为任何其他全局函数

-Virtual:这些可以在运行时通过 vtable 访问,以执行动态调度。

-非静态和非虚拟:我在这里遇到麻烦了。大多数文章或解释说,它们只是在代码中以与普通函数相同的方式表示,唯一的区别是它们期望隐藏的“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++对象实例成员函数内存表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30527374/

相关文章:

matlab - MATLAB 列的内存分析含义

微分求解器上的 C++ 段错误

java - 限制 Java 控制台堆占用空间?

javascript - 仅在 IE9 标准模式下的 asp.net javascript 内存泄漏

linux - 为什么ps和free的内存占用差异这么大?

c++ - 哪个 vector 地址更安全?

C++ 宏从 .cpp 初始化在 .h 中声明的变量

即使使用 -lwininet 链接器标志,C++ wininet 也 undefined reference

c++ - 如何正确使用 FindResourceW()?

c++ - 重置 std::stringstream 格式标志