(c++内存布局)问题:编译器会为实例的方法分配内存吗?

来源:百度知道 编辑:UC知道 时间:2024/07/02 15:20:18
c++创建一个类的实例就相当于申请一块内存类存放这个内存的属性值,问题是这个实例的方法也要申请内存吗??

类的实例只包括的非静态成员变量,继承来的成员变量,虚函数表指针变量(如果存在虚函数的话)。
类的方法不存在类的实例所开辟的空间内的。
类的方法会在参数列表中插入一个this指针作为参数,所以类的方法不存在类的实例的内存空间里,也能访问实例的成员。
例如:
A a;
a.get();//相当于a.get(&a),这个是由编译器完成的;当然this指针一般都是不显式写出来的,如果你想写出来也是对的

所有该类的实例只需要同一块内存来存放这些实例的相应方法,因为对于所有实例而言,方法是相同的。

实际的存放规则应该是:
声明一个类的时候,该类不占用任何内存。
声明第一个该类的实例,系统为该类(不是实例)的所有方法分配一块内存A,为该类(不是实例)的所有全局成员分配一块内存B,为该实例(注意,这里是实例,不是类)的所有非全局成员分配一块内存C,并为该实例(不是类)分配一块额外的内存D,用来存放指向各个方法的函数指针。

调用某个实例的方法的时候,实际上只是调用了内存D中的函数指针。