gpt4 book ai didi

c++ - 包含虚拟成员函数的类的大小

转载 作者:行者123 更新时间:2023-11-28 07:45:22 24 4
gpt4 key购买 nike

我是 C++ 编程的新手,我对包含虚拟成员函数的类的大小有疑问。请通过我下面的代码:

#include "stdafx.h"
#include <iostream>
using namespace std;

class BaseClass
{
private:
int a, b;
public:
BaseClass()
{
a = 10;
b = 20;
}

virtual int area()
{
return 0;
}
};

class DerivedClass1 : public BaseClass
{
int x;

public:
virtual void simple()
{
cout << "inside simple" << endl;
}
};

int main()
{
DerivedClass1 Obj;
cout << sizeof(Obj) << endl; // Displays 16 bytes

return 0;
}

上面的代码显示大小为 16 个字节。根据我的说法,它应该显示 20 个字节,因为两个虚拟指针(一个是从基类继承的,一个是由于它自己的虚函数而添加到派生类本身)+派生类中的三个数据成员等于 20 个字节。所以请解释一下这是怎么回事....

最佳答案

在这种情况下,因为虚拟表指针将在整个类层次结构中通用。因此,BaseClass 已经具有虚函数,DeriveClass1 中的附加虚函数不会增加类的大小。

这是你的类的内存布局:

class DerivedClass1 size(16):
+---
| +--- (base class BaseClass)
0 | | {vfptr}
4 | | a
8 | | b
| +---
12 | x
+---

Derivedass1::$vftable@:
| &DerivedClass1_meta
| 0
0 | &BaseClass::area
1 | &DerivedClass1::simple

在MVSC中编译时可以使用-d1reportAllClassLayout选项来显示类的内存布局。

关于c++ - 包含虚拟成员函数的类的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14995275/

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