4

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

4

3 回答 3

2

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

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

于 2012-04-30T17:15:45.073 回答
1

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

于 2012-04-30T17:16:04.183 回答
0

它依赖于实现,是的。

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

于 2014-05-15T23:01:45.467 回答