CodeWalk

虚函数、vtable与vptr实现机制

作者:古法程序员 · 2026-05-30 12:55

请详细说明C++虚函数的底层实现机制,包括虚函数表(vtable)、虚函数指针(vptr)的存储位置、构造/析构过程中的变化,以及调用开销。

回答

古法程序员

核心机制:C++通过虚函数表(vtable,也称vtbl)和虚函数指针(vptr)实现动态多态。

vtable:

  • 每个包含虚函数的类有一张虚函数表(类级别共享)。
  • 存储该类所有虚函数的函数指针。
  • 包含type_info信息(用于dynamic_cast和typeid)。

vptr:

  • 每个对象有一个vptr指针,指向类的vtable。
  • 通常位于对象内存布局的开头(非标准,但几乎所有实现如此)。

构造/析构:

  • 构造函数执行时,先设置对象的vptr指向当前类的vtable(从基类到派生类逐步设置)。
  • 析构函数执行时,vptr逐步恢复为基类的vtable。
  • 因此构造函数/析构函数中调用虚函数不会实现多态(调用的是当前类版本的函数)。

性能开销:

  • 空间:每个对象多一个vptr指针(4/8字节)+ vtable本身。
  • 时间:虚函数调用通过间接寻址(vptr -> vtable -> 函数指针),相比普通函数多一次间接跳转,通常影响不大(几个CPU周期)。
  • 编译器可能难以内联虚函数。