mm等于毫米 2024-05-21 20:59 采纳率: 25%
浏览 2
已结题

C++:验证vptr指针

C++中运行的 验证vptr指针大小,结果是12?这是为什么?

#include<iostream>

using namespace std;

class Parent
{
public:
    Parent()
    {
        this->a = 0;
    }
    virtual void func()
    {
        cout << "Parent::func()..." << endl;
    }
    virtual void func(int a)
    {
        cout << "Parent::func(int a)..." << endl;
    }
    void func1(int a)
    {
        cout << "Parent::func1(int a)..." << endl;
    }
private:
    int a;
};

class Parent1:public Parent
{
public:
    Parent1():Parent()
    {
        this->a = 0;
    }
    virtual void func()
    {
        cout << "Parent::func()..." << endl;
    }
    virtual void func(int a)
    {
        cout << "Parent::func(int a)..." << endl;
    }
    void func1(int a)
    {
        cout << "Parent::func1(int a)..." << endl;
    }
private:
    int a;
};

int main(void)
{
    Parent p1;
    Parent p2;

    cout << "sizeof(p1)" << sizeof(p1) << endl;//16
    cout << "sizeof(p2)" << sizeof(p2) << endl;//16

    return 0;
}

img

  • 写回答

3条回答 默认 最新

  • 专家-百锦再@新空间代码工作室 全栈领域优质创作者 2024-05-21 21:02
    关注

    在C++中,对于虚函数的实现,编译器通常会在包含虚函数的类的对象中添加一个指向虚函数表(vtable)的指针(vptr)以实现多态。vptr的大小取决于操作系统和编译器的不同,但通常是由类中包含的虚函数数量决定的。

    在提供的代码中,Parent类和Parent1类都包含了虚函数,因此它们的对象在内存中会包含一个vptr指针。在main函数中,分别创建了Parent类和Parent1类的对象p1和p2,并通过sizeof运算符输出它们的大小。

    由于Parent和Parent1类都有相同的虚函数数量,所以它们的vptr指针大小应该相同。根据输出结果为16,可能是因为编译器在给对象分配内存时做了一些对齐的优化,导致对象大小为12个字节(存储int类型的a变量)加上4个字节(存储指向vtable的指针)的总和为16个字节。

    需要注意的是,实际的输出结果可能会因为编译器、操作系统和硬件平台的不同而有所变化。


    有问题你别着急,评论留言都可以,看到马上就回复,尽量及时补充齐
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月29日
  • 已采纳回答 5月21日
  • 创建了问题 5月21日

悬赏问题

  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 python螺旋图像
  • ¥15 算能的sail库的运用
  • ¥15 'Content-Type': 'application/x-www-form-urlencoded' 请教 这种post请求参数,该如何填写??重点是下面那个冒号啊
  • ¥15 找代写python里的jango设计在线书店
  • ¥15 请教如何关于Msg文件解析
  • ¥200 sqlite3数据库设置用户名和密码
  • ¥15 AutoDL无法使用docker install吗?