gpt4 book ai didi

c++ - C++中基类对象和派生类对象的大小

转载 作者:太空狗 更新时间:2023-10-29 21:19:30 25 4
gpt4 key购买 nike

#include <stdio.h>

class Base1
{
public:

virtual int virt1() { return 100; }

int data1;
};

class Derived : public Base1
{
public:

virtual int virt1() { return 150; }

int derivedData;
};

int Global1( Base1 * b1 )
{
return b1->virt1();
}

main1()
{
Derived * d = new Derived;

printf( "%d %d\n", d->virt1(), Global1( d ));
printf("size: Base1:%d\n", sizeof(Base1));
printf("size: Derived:%d\n", sizeof(Derived));
}

我用上面的代码打印出了基类和派生类的大小。我在 64 位机器上运行代码。我电脑的输出是

150 150
size: Base1:16
size: Derived:16

我还尝试使用 sizeof(int) 打印出 int 的大小,它是 4。

我有以下问题:

  1. 对于Base1类的大小,它应该包含一个vptr指向vtable 和一个整数 data1。为什么它的大小是 16 而 sizeof(int)在我的机器上是 4。
  2. 对于派生类,它应该有继承自Base1类的数据和一个额外的整数。它应该有更大的尺寸比 Base1 类,为什么它们是相同的?
  3. 除了这些的大小,派生类中的 vptr 是什么? Derived 类中的 vptr 是否会覆盖从 Base1 继承的 vptr上课?

最佳答案

For the size of Base1 class, it should contain a vptr points to the vtable and an integer data1. Why its size is 16 while sizeof(int) is 4 in my machine.

填充以确保当 Base1 位于必然连续的† 数组中时 8 字节指针的正确对齐。

† C++ 标准要求数组元素在内存中是连续的,并计算索引 i 处元素的内存地址和数组的基地址加上 i 乘以元素大小

For the derived class, it should have the data inherited from Base1 class and an additional integer. It should have bigger size than Base1 class, why they are the same?

已为额外的 int 成员回收填充。您可以通过输出 d&d->data1&d->derivedData 来观察这一点。

Besides the size of these, what's the vptr in Derived class? Will the vptr in Derived class override the vptr inherited from the Base1 class?

在使用指向虚拟调度表的指针的实现中(我所知道的每个编译器,但它不是 C++ 标准强制要求的),Derived 类构造函数和析构函数会覆盖“vptr”-前者在构造函数主体运行之后 写入指向 Derived 的 VDT 的指针,后者在 之前恢复指向 Base VDT 的指针 析构函数主体运行(这确保您不会在对象的正式生命周期之前或之后调用对象的 Derived 成员函数)。

关于c++ - C++中基类对象和派生类对象的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27007797/

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