美文网首页
关于C++虚表和虚指针问题,反汇编深究。

关于C++虚表和虚指针问题,反汇编深究。

作者: darkness_cc0a | 来源:发表于2020-06-13 02:09 被阅读0次

Cpp中多态的实现借助于虚表和虚指针,子类通过重写父类的虚函数,实现运行时多态,也叫延迟绑定,将编译期的事推迟到运行期完成。

因为手机编写的原因,上图很麻烦。Cpp中如果类中有虚函数,实例化的对象的第一个成员将会是虚指针,也就是说如果该对象的虚拟地址是0x7fffff86,那么虚拟内存从0x7ffffff86开始的8字节(64位)里的值就是虚指针的值。通过g++(版本忘了)编译链接后,虚表存在.data.rel.ro段(这个段的含义我也不太清楚,应该是只读数据重定位段,我猜是因为虚函数是运行时绑定因此需要重定位,一旦地址确定后不再改变所以只读),所以可以得出虚表在编译期就已经确定,在程序还没被装载执行时,子类虚表里存在的便是已经重写的虚函数的入口地址。运行时只是在构造函数里确定虚指针的位置,即让虚指针指向相应的虚表。通过反汇编和gdb调试可以知道虚表(64位机)的结构如下:

-------------------  <-vtable地址

8个字节的0 即0x00000000

-------------------

类的Typeinfo信息的入口地址

-------------------  <-虚指针指向(vtable+0x10)

虚函数1入口地址

-------------------

虚函数2入口地址

相关文章

网友评论

      本文标题:关于C++虚表和虚指针问题,反汇编深究。

      本文链接:https://www.haomeiwen.com/subject/yvgotktx.html