c++ - 虚拟指针大小根据类数据成员而变化

标签 c++ virtual

正如这个问题的解决方案之一( 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;
} 

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

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

相关文章:

c++ - 区分选定单元格和编辑单元格

c++ - 虚拟纯函数

c# - 当需要重写和隐式类使用时如何处理基本非虚拟/非抽象属性?

C++ std::function 语法问题

c++ - cin.get 和 char 错误信息

c++ - 将 MacOSPath 转换为 POSIX 时如何设置卷名

c++ - 我如何在 opencv 中顺序访问轮廓

c++ - 子对象中存在 VPTR

c++ - std::exception 的 What() 方法不是虚拟的?

c++ - C++ 中的函数覆盖在没有 'virtual' 的情况下工作