c++,这个运行结果怎么得来的?

天王盖地虎626 发布于 05/13 08:13
阅读 154
收藏 0

下面的这段代码,在我这边的电脑上运行结果是

16
32
48

让我困惑不已(运行环境是ubuntu下)

如果把,virtual void aa(){},virtual void bb(){};,virtual void cc(){};给去掉,其运行结果是

4
16
32

麻烦朋友帮我分析下其结果哦,谢谢。
#include <iostream>
using namespace std;

class A
{
    int k;
public:
    virtual void aa(){};
};

class B:public virtual A
{
    int j;
public:
     virtual void bb(){};
};

class C:public virtual B
{
    int i;
public:
     virtual void cc(){};
};

int main()
{
    cout << sizeof(A) << endl;
    cout << sizeof(B) << endl;
    cout << sizeof(C) << endl;
    return 0;
}
 

加载中
1
_
___coder

类中存在虚函数的情况下,每个类会有一个虚函数指针,指向虚函数表,你的操作系统应该是64位,指针大小为8,int大小为4, 加上内存对其,所以sizeof(A)=16, class B虚继承自class A,所以B里面又多了一个虚基类指针,再加上int j 4字节,加内存对其 所以sizeof(B)=32, sizeof(C)也是和B同理。整个逻辑建议看深度探索c++对象模型,里面又c++对象内存模型详细解释。

class A:

int 4字节
内存对其4字节
虚函数指针8字节

class B:

class A 16字节
int 4字节
内存对其4字节
虚基类指针8字节

 

0
vasn
vasn
c++都忘干净了,感觉还是虚函数表造成的。。。
0
tcxu
tcxu

我在 Dev-C++ 5.4.0 运行结果如下:
为去掉3个虚函数的运行结果:
8
16
24
去掉3个虚函数后,运行结果 (解释放在圆括号内):
4  (成员变量 k,占 4 字节)
12 (成员变量 k,j 占 8 字节, 1 个虚基类表指针 占 4 字节)
20 (成员变量 k,j, i 占 12 字节, 2 个虚基类表指针 占 8 字节 )

从未去掉虚函数的结果看,每行都比去掉的多4个字节。 这可以解释为每次都增加一个虚函数指针的缘故。

参考:
C++中虚继承的作用及底层实现原理

返回顶部
顶部