【发布时间】:2018-09-01 21:19:14
【问题描述】:
正如该问题的解决方案之一 (Size of virtual pointer-C++) 中所述,您可以通过以下方式计算虚拟指针大小:
struct virtual_base {
int data;
virtual_base() {}
virtual ~virtual_base() {}
};
struct non_virtual_base {
int data;
non_virtual_base() {}
~non_virtual_base() {}
};
int main() {
std::cout << sizeof( virtual_base ) - sizeof( non_virtual_base ) << '\n';
return 0;
}
但是当我在 cpp.sh http://cpp.sh/7o5av 上尝试这个时,没有数据(成员变量)我得到的大小为 7,数据大小为 12,所以我无法理解这种行为,任何见解都会有帮助,我知道空类的大小是 1,第二个是数据成员,我希望这应该是 11 而不是 7
【问题讨论】:
-
好的,那么以编程方式计算 vptr 大小的可靠方式是什么
-
问题是没有数据的非虚拟类的大小为1,即使它实际上没有任何东西,因为大小永远不会是0。所以
sizeof(non_virtual_base)并不是真的显示结构使用了多少空间。 -
还要注意对齐问题:如果 vTable 不完全是 N*64 位长,编译器可能会在成员之间添加一些填充空间。
-
但是一个空的虚拟类不需要在大小上加1,因为VPTR使用空间(它就像一个额外的数据成员)。这就是为什么您需要使用具有至少 1 个数据成员的类才能正常工作。
-
@PhilipV vtable 不在每个对象中,它是每个类的数据结构。该对象只包含一个指向它的指针。