我只是想了解这段代码背后的逻辑。当成员函数不属于对象时,编译器将如何调用该函数。编译器需要以某种方式知道要调用的函数的地址。它在哪里获取正确函数的地址。我知道这是一个愚蠢的问题,但很好奇地了解了此函数背后的内在真理
#include <iostream>
using namespace std;
class Base {
public:
Base() {
cout << "Base class constructor\n";
}
void Fun()
{
cout << sizeof(this) << endl;
cout << "This is member function" ;
}
void Fun1()
{
cout << "This is second member fun" << endl;
}
int Val;
};
int main(int argc, char* argv[])
{
Base Obj;
cout << sizeof(Obj) << endl;
Obj.Fun();
return 0;
}
答案 0 :(得分:1)
以某种方式,编译器需要知道要调用的函数的地址。
编译工具链负责选择函数的位置(为简单起见,让我们忽略动态链接和地址空间随机化)。这就是为什么工具链知道函数将在哪里。
例如,假设工具链选择将函数Base::Fun
定位在地址0x008中。因此,当调用函数Base::Fun
时,工具链会知道该调用必须位于地址0x008中。