正如这个问题的解决方案之一( 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
最佳答案
您会得到没有数据成员的7
,因为空类的大小为1
,因此虚拟类包含指向大小为8的虚拟表的指针: 8-1=7
。
当涉及到数据成员时,您得到的结果取决于成员的实际类型。如果您使用 int
,则差异为 12
,因为 vptr 必须与 8
的倍数对齐。
这意味着int数据成员占用字节0到4,并且vptr不能存储在字节4
处,而是从字节8开始。所以总大小为8+8=16
为虚拟结构。尝试使用 double,您将看到差异为 8
,如以下代码所示。
#include <iostream>
using namespace std;
struct virtual_base {
double data;
virtual_base() {}
virtual ~virtual_base() {}
};
struct non_virtual_base {
double data;
non_virtual_base() {}
~non_virtual_base() {}
};
int main() {
std::cout << sizeof( virtual_base ) - sizeof( non_virtual_base ) << '\n';
return 0;
}
关于c++ - 虚拟指针大小根据类数据成员而变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49445558/