我很好奇为什么vptr的大小似乎在64位机器上占用64位,以及C ++是否真的需要它。
所有vptr需要做的是指向vtable,并且因为vtable不能占用太多内存并且可以组合在一起32位应该足以解决它们。
您的课程中有多少课程? 1000? 10000?他们平均有多少虚拟功能?也许100?如果编译器+链接器连续放置所有vtable,则它们不能超过几MB。将具有32位索引的特定vtable用于“所有vtable的数组”应该可以工作。
我甚至在谈论这个的原因是因为某些具有虚函数的小类;有时我会看到一个只有2个字+ vptr的类的大型对象数组,而64位vptr对内存使用有很大的影响。
答案 0 :(得分:3)
不,它不必是64位。但是,有几个原因:
注意,有一个内存模型(用于gcc的ILP32,-mx32
开关)很少使用,其中指针是32位,但可以使用64位寄存器。
现在,微观优化内存并不是焦点。例如,编译器可以自由地在访问说明符中重新排序成员(因此可以减少填充),但是我所知道的编译器没有这样做。
答案 1 :(得分:1)
你的怀疑是正确的,这确实是C ++所允许的。但是,16位可能不太现实。即使所有vtable都大于4 GB,它们通常也不会超过40亿个条目。典型的稳定条目是64位,因此40亿条目需要32 GB。