类是如何在 C++ 内部实现的?

cbi*_*der 5 c++ class

我试着用谷歌搜索它,但没有找到任何结果。该实现是否类似于 C 中使用函数指针和数据结构的类 hack?还是以另一种形式实现?

utn*_*tim 2

我没有编写任何c++编译器,但是类的结构应该包含:

  • 基类数据部分(包含该类基类的所有数据)
  • 类实例数据部分(包含类实例的所有数据)
  • 虚表指针(如果类或其基类至少有一个虚函数)

注意:非虚函数是静态引用的,因此它们不应该直接绑定到类实例。

也就是说,每个编译器的实现方式可能略有不同。

TLDR:本质上是的,实现必须类似于类 hack(但这对于开发人员来说应该是透明的/无关的)。

编辑

这篇文章主要是猜测,基于多年使用 Visual Studio 进行的调试(非常主观),并以多年前的一些经验为后盾,维护一个具有支持继承的类 hack 的项目,用 C 实现(这样的经验也非常主观)。

例如,在 Visual Studio 6 中,您可以看到虚拟函数表是在 C++ 实现特定数据之前分配的。也就是说,一个类看起来像这样:

[vtbl][data]
^1    ^2
Run Code Online (Sandbox Code Playgroud)

所以如果这是为了(例如)struct X { virtual ~X(); int i; },那么写:

X a;
X *p = &a;
Run Code Online (Sandbox Code Playgroud)

会创建类似的东西:

[ptr + 1] -> any other virtual functions
[ptr + 0] -> X::~X
^x

[^x][data]
^1  ^2
    ^p = ^2;
Run Code Online (Sandbox Code Playgroud)

如果^1是操作系统分配内存的位置(并且 vtbl 将在 的实现中填充new),则用户数据的偏移量 ( vtbl + sizeof (vtbl)) 将作为类的地址返回给客户端代码。我不知道现在是否仍然如此。