繁体   English   中英

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM