64 位机器上 vptr 的大小**必须**是 64 位吗?

Does the size of vptr on 64-bit machines **has** to be 64 bits?

我很好奇为什么 vptr 的大小在 64 位机器上似乎需要 64 位以及 C++ 是否真的需要它。

所有 vptr 需要做的就是指向 vtables,并且由于 vtables 不能占用太多内存并且可以组合在一起,32 位应该足以解决它们。

您的程序中有多少 classes? 1000? 10000?他们平均有多少虚函数?也许100?如果编译器+链接器连续放置所有虚表,它们占用的空间不会超过几 MB。将具有 32 位索引的特定 vtable 寻址到 "array of all vtables" 应该可以工作。

我什至谈论它的原因是因为某些带有虚函数的小 classes;有时我看到 class 的大量对象只有 2 个字 + vptr,而 64 位 vptr 对内存使用有重大影响。

你的猜测是对的,这确实是C++允许的。不过,16 位可能不现实。即使所有 vtable 都大于 4 GB,它们通常也不会超过 40 亿个条目。一个典型的稳定条目将是 64 位,因此 40 亿个条目将占用 32 GB。

不,不一定是 64 位。但是,有几个原因:

  • 有可能 class 的第一个成员需要 64 位对齐,因此在这种情况下没有任何好处
  • 通常,vptrs 不会占用大量内存
  • 最强论点:如果 vptr 是 32 位索引,那么所有虚函数调用都会变慢(因为额外的内存引用),并且会生成更大的代码。这根本不值得。

注意,有一种内存模型(ILP32,gcc的-mx32开关)很少用到,指针是32位的,但是64位的寄存器可以用

内存的微优化现在不是重点。例如,编译器可以自由地跨访问说明符重新排序成员(因此可以减少填充),但据我所知,没有编译器这样做。