gpt4 book ai didi

c++ - vptr 是如何在编译时初始化的?

转载 作者:搜寻专家 更新时间:2023-10-31 00:08:44 26 4
gpt4 key购买 nike

以上是一道面试题。

据我了解,作为虚拟分派(dispatch)机制的一部分,编译器会为每个类创建一个vTable,并在编译期间插入一个额外的指针(vptr)。但是它究竟是什么时候将类的虚拟表分配给这个 vptr 的呢?

vptr 是如何在编译时初始化的?

无论我在互联网上读到什么,编译器都会在编译时初始化 vptr,但初始化是一种运行时机制。我错了吗?

我不明白编译器是如何初始化它的。

最佳答案

严格来说,这不在C++标准的涵盖范围之内。但是足够多的实现将其视为常识。我将只讨论单继承,因为多继承要复杂得多。

编译器预先知道类型的虚函数表位于何处(由编译器分配)。它还知道该类类型的所有构造函数。所以它要做的很简单,在每个构造函数的开头,添加以下内容(说明性的):

this->_vptr = /*VTable's Address*/;

就是这样。这非常简单,甚至在覆盖时也能直观地工作。因为派生类的构造函数只会覆盖指针值。

是的,该分配自然发生在运行时。即使表格本身可能已预先填充。

关于c++ - vptr 是如何在编译时初始化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47264695/

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