查看: 1890| 回复: 3
跳转到指定楼层
上一主题 下一主题
收起左侧

[学C/C++] 请教一道C++面试题,关于对象模型及编译

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x

如题,我最开始看到觉得应该是a.show()快,因为对象引用类的普通方法是在编译期可以确定的,但ptr作为指向对象a的虚函数表地址的指针,需要在运行时确定。后来尝试用GCC编译了下,发现这两句话生成的汇编语句几乎是一样的。。
想请教下各位C++大佬们:
1. 到底那个语句更快?如果把show()这个方法改为虚函数,结果会变化吗?
2. 编译器在处理ptr->show()时,到底是怎么找到show()的,按我的理解,它会去a的虚函数表里找,但找不到的。。

上一篇:大厂店面秒跪以后对于刷题方式的严肃思考
下一篇:求组队学algorithm公开课
全局:
编译器会储存CTest::show的位置,不是必须经过虚函数表才能找到CTest::show。虚函数表只是用来检查子类有没有覆盖show的定义。

如果不加virtual,那么不管ptr指向什么类型,编译器都只会调用CTest::show,不会去管子类有没有定义test,因此不需要虚函数表。

如果加了virtual,那么子类可以覆盖CTest::show,所以ptr->show()需要虚函数表。但是编译器在看到a.show()的时候知道a的类型一定是CTest,不可能是CTest的子类,所以经过优化以后a.show()不会经过虚函数表,而是直接调用CTest::show。(ptr->show()依然会经过虚函数表,因为ptr可以变,编译器不会记住ptr指向的到底是什么,所以不会优化)

评分

参与人数 1大米 +1 收起 理由
hanhan13 + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

全局:
标准甚至都没规定多态一定要用虚表来实现,所以.....
回复

使用道具 举报

🔗
 楼主| hanhan13 2020-5-12 20:47:18 | 只看该作者
全局:
helloworld27 发表于 2020-5-12 14:58
编译器会储存CTest::show的位置,不是必须经过虚函数表才能找到CTest::show。虚函数表只是用来检查子类有没 ...

明白了,感谢大佬~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表