C++类的虚拟函数表存储在哪里

Where is the virtual function table for C++ class stored?

本文关键字:存储 在哪里 函数 虚拟 C++      更新时间:2023-10-16

我试图找到c++类的虚拟函数表的确切存储位置。我找到了一些答案,例如它是"函数指针的静态数组"那么它会存储在数据段只读内存中吗?(初始化一个)

很可能

是的。但是,这不是强制性的。甚至没有强制要求通过虚拟函数表实现多态性,但在大多数平台上都是如此。这些都是实现细节,只要编译器遵守标准设定的行为,它就可以做任何它想做的事情。

vftable是每个类一个,并且仅存储在内存中的一个位置。

当您将任何函数设为虚拟时,编译器将在您的类中插入一个 vptr。因此,类的大小将增加 4 个字节(在 Win32 上)。此指针保存虚拟表 (vtable) 的地址。vtable 由编译器在编译时构造,基本上只不过是一个函数指针数组。函数指针实际上是指向该特定类的虚函数的指针。更准确地说,虚拟表是函数指针的静态数组,因此同一类的不同实例可以共享该 vtable。由于静态成员存储在数据部分 (.data) 中,因此 vtable 也存储在可执行文件的数据部分。

它是依赖于实现的,是的。

对于 g++(4.9.0),虚拟表(不是指针)存储在 ELF 文件的 .rodata 部分及其相应的段 LOAD 内存中。