据我所知,当类定义时,所有成员函数将在单独的内存中创建,并且对于所有对象都是通用的。只有成员变量会为每个对象分别创建。但是,当使用对象调用成员函数时,该成员函数如何执行?
这些成员函数的地址存储在哪里?
class B{
public:
int a;
void fun(){
}
};
int main(){
B b;
std::cout<<sizeof(b)<<std::endl;
}
如果我执行这个程序,我会得到输出4(只是成员变量)。但是调用b.fun()会正确地调用它的成员函数。它是怎么在没有将地址存储在对象内部的情况下调用的?成员函数地址存储在哪里?
是否有类内存布局这样的东西,其中这些地址将被存储?
void fun(B *b) {}
,并执行fun(b);
。现在,您不会感到惊讶,因为不相关的函数不会影响B
的大小?成员函数的工作方式类似,只是调用它们的语法不同。 - HolyBlackCatthis
参数)。通常要调用的函数地址会被“存储”在调用指令本身中,作为立即操作数。不需要在其他地方为函数指针留出空间;特别是它不会存储在该类型对象的内存布局中。如果您想了解内部细节,请指定您的编译器/架构/操作系统/ABI/代码模型等信息。 - Nate Eldredge