C++对象的内存布局
据我了解,所有成员函数在类定义时都将在单独的内存中创建,并且对所有对象都是通用的。并且只为每个对象单独创建成员变量。但是使用对象调用时成员函数是如何执行的呢?
这些成员函数的地址将存储在哪里?
class B{
public:
int a;
void fun(){
}
};
int main(){
B b;
std::cout<<sizeof(b)<<std::endl;
}
如果我执行这个程序,我得到的输出为 4(仅用于成员变量)。但是调用 b.fun() 正确调用了它的成员函数。它如何在不将其地址存储在对象中的情况下进行调用?成员函数地址存储在哪里?
是否有类似类内存布局的东西将存储这些地址?
回答
非虚拟成员函数非常像常规的非成员函数,它们之间的唯一区别是指向作为调用时第一个参数传递的类实例的指针。
这是由编译器自动完成的,因此(在伪代码中)您的调用b.fun()可以编译为
B::Fun(&b);
哪里B::Fun可以看作是一个平常的功能。该函数的地址不必存储在实际对象中(该类的所有对象都将使用相同的函数),因此类的大小不包括它。