为什么我们需要 VPTR?
为什么我们不对非虚函数使用相同的方法呢?
我的意思是,为什么我们要以这种方式使用虚拟函数?我们不能将它们用作非虚拟的并覆盖它们吗?
如果这种方法节省了我们的时间/空间或其他什么,为什么我们不对非虚拟函数使用相同的方法呢?我的意思是,对于特定的类来说,有一个函数表是有意义的。
不管怎样,提前谢谢,我只是有点困惑。
And why don't we use the same method for non virtual functions?
I mean, why do we use virtual functions in that way? Can't we just use them as non-virtaul ones and override them?
And if this method is saving us time/space or what ever, why don't we use the same method for non-virtual functions? I mean it would make sense that there would be one table of functions for a specific class.
Anyway, thanks in advance, I am just a bit confused.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果不使用一定程度的间接寻址,就无法实现运行时多态性。这就是 vptr 的用途。
vptr 不用于非多态函数,因为这种间接寻址会产生一些代价。 C++ 的哲学是,你不必为不使用的东西付费。
编辑:
以下是有关虚拟表如何工作的一些信息: http://en.wikipedia.org/wiki/Virtual_table< /a>
You can't have run-time polymorphism without using a level of indirection. That's what the vptr is for.
The vptr is not used for non-polymorphic functions because that indirection costs something. The C++ philosophy is that you don't pay for what you don't use.
EDIT:
Here's some info on how virtual tables work: http://en.wikipedia.org/wiki/Virtual_table
编译器本质上生成对非虚拟方法的直接调用。通过虚拟方法调用,编译器生成代码来查找方法的地址,然后调用该地址。因此,理论上,调用虚函数时至少要多查找一次。否则就没有理由承担这笔费用。
The compiler essentially generates a direct call to non-virtual methods. With a virtual method call, the compiler generates code to lookup the address of the method and then makes a call to that address. Thus, it is, in theory, at least one more lookup when calling a virtual function. There would be no reason to incur that cost otherwise.
使用 vptr 允许基于对象类型而不是变量类型进行方法解析。不使用 vptr 会使方法调用更快。 C++ 设计者决定允许虚拟函数的便利性,但不需要其他函数的性能损失。
Using vptr allows method resolution based on object type rather than variable type. Not using vptr makes method calls faster. The C++ designers decided to allow the convenience of virtual functions but not require the performance penalty for other functions.