2015-05-29 80 views
0

C++中的成员函数究竟代表了什么内存?据我所知,基本上有三种功能:C++对象实例成员函数内存表示

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

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

非静态和非虚拟:我在这里遇到麻烦。大多数文章或解释说,它们只是以与正常函数在代码中相同的方式表示,唯一的区别是它们希望隐藏的“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(); 

是否OBJET A的实例有一个指针在某处存储在内存中的功能get_member_var_a,并简单地将调用函数,同时传递一个实例指针作为额外的参数?

+0

去试试看python。经过几个例子(实际上是第一次)后,你会看到我为什么把你送到那里。 – bolov

+0

我正在定期使用python ^^ – tomooka

+0

这就是发生了什么:python中的成员函数是第一个参数是对象本身('__self__')的常规函数​​。在C++,java等中,这种机制是隐藏的。 – bolov

回答

2

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

int A::get_member_var_a()将最有可能被编译成类似 int __internal_compiler_prefix___A___get_member_var___thiscall(A* this)

所有a->fun()将“替换为”由编译器fun(a)

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

1

非静态非虚函数将被C++编译器破坏为“新”函数。此外,“新”功能的第一个参数将是“this”指针。

instance_of_a->get_member_var_a(); 

编译器将上面的行转换为类似:

mangled_function_name_for_get_member_var_a(本)

例如,编译器可以裂伤的功能类似_ZN1A16get_member_var_aEv。