gpt4 book ai didi

C++——与对象或类相关联的 vptr 和 vtable?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:15:02 27 4
gpt4 key购买 nike

vptr -- 虚表指针

vtbl——虚拟表

问题1>vptr与类的对象相关联是否正确?

问题2>vtbl与类关联是否正确?

问题 3> 它们如何真正协同工作?

谢谢

最佳答案

请注意 vptrvtbl 是实现定义的 C++ 标准甚至没有谈论它们。然而,大多数已知的编译器通过 vptrvtbl 实现动态调度。

问题一:vptr与类的对象相关联是否正确?


vptr 与包含Atleast one 虚拟成员函数的类的对象相关联。编译器将 Vptr 添加到 多态类的每个对象(包含至少一个虚成员函数)this 指针的前 4 个字节然后指向 vptr

问题2:vtbl与类关联是否正确?


Vtbl 与类关联。为每个 Polymorphic 类创建一个 vtbl

问题 3:它们如何真正协同工作?

编译器为多态类的每个对象添加一个vptr,并为每个类创建一个vtblvptr 指向 vtblvtbl 包含该类中所有虚函数的地址列表。如果派生类覆盖基类的虚函数,则 vtbl 中该特定函数的地址条目将替换为被覆盖函数的地址。在运行时,编译器根据指针内部的地址而不是指针的类型遍历特定类(Base 或 Derived)的 vtbl,并调用 vtbl 中的函数地址>。从而实现了动态多态
这种动态多态的代价是:
fetch(获取里面的vptr) fetch(从vtbl中的函数列表中获取函数地址) Call(调用函数)

相对于调用(静态绑定(bind)后直接调用函数)。

关于C++——与对象或类相关联的 vptr 和 vtable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5467956/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com