64位机器上vptr的大小**是否为64位?

时间:2017-11-30 01:14:50

标签: c++ language-lawyer vtable vptr

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

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

您的课程中有多少课程? 1000? 10000?他们平均有多少虚拟功能?也许100?如果编译器+链接器连续放置所有vtable,则它们不能超过几MB。将具有32位索引的特定vtable用于“所有vtable的数组”应该可以工作。

我甚至在谈论这个的原因是因为某些具有虚函数的小类;有时我会看到一个只有2个字+ vptr的类的大型对象数组,而64位vptr对内存使用有很大的影响。

2 个答案:

答案 0 :(得分:3)

不,它不必是64位。但是,有几个原因:

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

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

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

答案 1 :(得分:1)

你的怀疑是正确的,这确实是C ++所允许的。但是,16位可能不太现实。即使所有vtable都大于4 GB,它们通常也不会超过40亿个条目。典型的稳定条目是64位,因此40亿条目需要32 GB。