内存中的vtable存储在哪里?

San*_*eep 25 c++ vtable

内存中的vtable存储在哪里?

Ale*_*ski 41

取决于编译器.

在VC++中,vtable指针存储在对象分配的开头,在任何成员数据之前.(假设您的班级至少有一个虚拟成员函数.)

如果你的类通过vtable多次继承其他类,那么也可能有多个vtable指针.

vtable本身静态分配在地址空间的某个地方.

然后对象布局看起来像(对于C的实例):

A's VTable ptr
A's member variables.
B's Vtable ptr
B's member variables.
C's member variables.
Run Code Online (Sandbox Code Playgroud)

对于heirarchy

class A {
  virtual Ax() {}
  int a, b;
};
class B {
  virtual Bx() {}
  int c, d;
};
class C : public A, public B {
  int foo, bar;
};
Run Code Online (Sandbox Code Playgroud)

  • 我想你在谈论vptr,即指向vtable的指针.Vtables本身通常存储在静态数据段中,因为它们是特定于类的(与特定于对象的). (23认同)
  • 的确,我修改了我的帖子:) (2认同)
  • 对象布局是针对 C 实例的,对吧?(与 A、B 和 C 相对) (2认同)

jal*_*alf 16

虚函数表?什么vtable?C++标准没有提到vtable.每个编译器都可以以任何方式实现虚函数.这包括将vtable放在任何喜欢的地方.

  • 不,这不是一个要求.POD类型就是这种情况,但是POD类型没有vtable,所以那里没有问题.对于非POD类型,不能保证结构的地址与第一个元素的地址相同. (4认同)