gpt4 book ai didi

c++ - 虚拟指针大小因类数据成员而异

转载 作者:搜寻专家 更新时间:2023-10-31 02:06:59 24 4
gpt4 key购买 nike

如该问题 (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 数据成员占用字节 frm 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;
}

在这里尝试:https://www.ideone.com/Ycpg64

关于c++ - 虚拟指针大小因类数据成员而异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49445558/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com