gpt4 book ai didi

c++ - 为什么 vptr 存储在具有虚函数的类的内存中的第一个条目?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:29 27 4
gpt4 key购买 nike

对于一些编译器,如果一个类有虚函数,那么它的 vptr 可以用它的对象的第一个字节的地址来访问。例如,

class Base{
public:
virtual void f(){cout<<"f()"<<endl;};
virtual void g(){cout<<"g()"<<endl;};
virtual void h(){cout<<"h()"<<endl;};
};

int main()
{
Base b;

cout<<"Address of vtbl:"<<(int *)(&b)<<endl;

return 0;
}

我知道它依赖于不同的编译器行为。由于存在将 vptr 存储为第一个条目的情况,这样做的好处是什么?这有助于提高性能还是仅仅因为使用 &b 更容易访问 vbtl?

最佳答案

这是一个实现细节,但实际上很多实现都是这样做的。

它相当高效和方便。假设您需要为给定对象调用虚函数。您有一个指向该对象的指针和虚函数索引。您需要以某种方式找到应该使用该索引和该对象调用哪个函数。好的,您只需访问指针后面的第一个 sizeof(void*) 字节并找到 vtable 所在的位置,然后访问 vtable 的必要元素以获取函数地址。

您可以存储一个单独的“每个对象的 vtable”映射或其他东西,但是如果您决定要将 vptr 存储在对象内部,那么使用第一个字节而不是最后一个字节或任何其他地方是合乎逻辑的因为使用这种方法,一旦有了指向对象的指针,您就知道在哪里可以找到 vptr,不需要额外的数据。

关于c++ - 为什么 vptr 存储在具有虚函数的类的内存中的第一个条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33560448/

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