C++对象的内存布局
memory layout of C++ object
据我了解,当 class 定义时,所有成员函数都将在单独的内存中创建,并且对所有对象都是通用的。并且只有成员变量是为每个对象单独创建的。但是使用object调用成员函数是怎么执行的呢?
这些成员函数的地址将存储在哪里?
class B{
public:
int a;
void fun(){
}
};
int main(){
B b;
std::cout<<sizeof(b)<<std::endl;
}
如果我执行这个程序,我得到的输出为 4(仅用于成员变量)。但是调用 b.fun() 会正确调用其成员函数。它是如何调用而不将其地址存储在对象中的?成员函数地址存放在哪里?
是否有类似 class 存储这些地址的内存布局?
Is there anything like class memory layout where these addresses will be stored?
有函数声明 virtual
,是的。在这种情况下,所述函数的地址存储在 table 中并在运行时查找。这反过来又允许您的代码在调用函数时根据对象的类型分派到正确的函数。
非虚函数不能这样工作。它们的存储方式与自由(即非成员)函数相同,函数名称以 class 的名称为前缀。对象本身不需要存储 space。
在这两种情况下,一个隐藏的 this
指针被传递给被调用的函数。这就是'connects'它给你的对象。
非虚拟成员函数与常规非成员函数非常相似,它们之间的唯一区别是指向 class 实例的指针在调用时作为第一个参数传递。
这是由编译器自动完成的,因此(在伪代码中)您的调用 b.fun()
可以编译成
B::Fun(&b);
其中B::Fun
可以看作是一个普通的函数。此函数的地址不必存储在实际对象中(此 class 的所有对象将使用相同的函数),因此 class 的大小不包括它。
据我了解,当 class 定义时,所有成员函数都将在单独的内存中创建,并且对所有对象都是通用的。并且只有成员变量是为每个对象单独创建的。但是使用object调用成员函数是怎么执行的呢?
这些成员函数的地址将存储在哪里?
class B{
public:
int a;
void fun(){
}
};
int main(){
B b;
std::cout<<sizeof(b)<<std::endl;
}
如果我执行这个程序,我得到的输出为 4(仅用于成员变量)。但是调用 b.fun() 会正确调用其成员函数。它是如何调用而不将其地址存储在对象中的?成员函数地址存放在哪里?
是否有类似 class 存储这些地址的内存布局?
Is there anything like class memory layout where these addresses will be stored?
有函数声明 virtual
,是的。在这种情况下,所述函数的地址存储在 table 中并在运行时查找。这反过来又允许您的代码在调用函数时根据对象的类型分派到正确的函数。
非虚函数不能这样工作。它们的存储方式与自由(即非成员)函数相同,函数名称以 class 的名称为前缀。对象本身不需要存储 space。
在这两种情况下,一个隐藏的 this
指针被传递给被调用的函数。这就是'connects'它给你的对象。
非虚拟成员函数与常规非成员函数非常相似,它们之间的唯一区别是指向 class 实例的指针在调用时作为第一个参数传递。
这是由编译器自动完成的,因此(在伪代码中)您的调用 b.fun()
可以编译成
B::Fun(&b);
其中B::Fun
可以看作是一个普通的函数。此函数的地址不必存储在实际对象中(此 class 的所有对象将使用相同的函数),因此 class 的大小不包括它。