C++类的成员函数,静态函数以及虚函数

今天在群里看了一个奇怪的代码。这样的代码是可以直接运行的

C++类的成员函数,静态函数以及虚函数

查看了编译以后的代码如下:

C++类的成员函数,静态函数以及虚函数

可以看到编译器编译以后的汇编代码,这里并没有使用任何pc指针所指向的内存中的数值。而是将pc作为this指针压入栈然后直接调用了c::run的地址。

C++类的成员函数,静态函数以及虚函数


C++类的成员函数,静态函数以及虚函数


接着就索性研究一下虚函数,成员函数和静态成员函数。

把类修改成如下。

C++类的成员函数,静态函数以及虚函数


执行代码如下:

C++类的成员函数,静态函数以及虚函数

可以看到成员函数以及静态函数都正常执行了,当通过pc指针引用虚函数的时候报告内存访问错误。


反编译查看一下代码如下:

C++类的成员函数,静态函数以及虚函数

可以看到成员函数和静态函数的入口地址都是在编译代码时确定的。而虚函数需要通过pc指针访问虚表来确定。这就需要访问pc所指向内存地址的数据。可是这里并没有创建对象。因此就报错了。


修改代码使用Placement new来初始化则可以正常访问虚函数。

C++类的成员函数,静态函数以及虚函数