首页 > 试题广场 >

64位电脑 运行c++结果输出() class A { &

[单选题]
64位电脑 运行c++结果输出() 
class A
{
    char a[2];
    public:
        virtual void aa(){};
};
class B:public virtual A
{
    char b[2];
    char a[2];
    public:
        virtual void bb(){};
        virtual void aa(){};
};
class C:public virtual B
{
    char a[2];
    char b[2];
    char c[2];
    public:
        virtual void cc(){};
        virtual void aa(){};
        virtual void bb(){};
};
int main()
{
    cout<<sizeof(A)<<endl<<sizeof(B)<<endl<<sizeof(C);
    return 0;
}

  • 8 16 24
  • 16 32 36
  • 16 32 48
  • 8 20 24
首先A的字节数等于2+8->16
B继承自A,故字节大小起始就是16,因为B自己又有个4个1字节的char和一个虚指针,故为16+2+8->32
C继承自A,故字节大小起始就是32,因为C自己有6个1字节char和一个虚指针,故为32+6+8->48
发表于 2019-08-04 13:15:25 回复(0)
这道题实际运行之后发现答案是16、40、64,我计算了一下好像确实是16、40、64
以类B来说,首先因为有虚函数,那么就会有虚函数表指针vfptr,其次虚继承自A,那么就会有虚基类指针vbptr,这里是8+8=16个字节。
接着是两个char数组的b和a(这个a不同于A类的a),因此是4个字节。
接下来考虑继承自A类的成员变量,同理有虚函数就会有vfptr,这里是8个字节,然后是char数组的a,共2个字节。
在内存上的分布就是
B:
    vfptr(8)
    vbptr(8)
    b[2](2)
    a[2](2)
    A:
        vfptr(8)
        A[2](2)
最后考虑字节对齐问题,那么就是8+8+2+2+4(字节对齐)+8+2+6(字节对齐)=40字节
_(:з)∠)_码了好多字也不知道对不对,如果错了就尴尬了。希望大佬指正
发表于 2019-03-08 20:04:15 回复(1)
类空间大小是成员中内存最大的值的最小整数倍。
比如类a,char数组的大小是2byte,虚函数占用的空间是8byte
所以类a的空间大小为8*2=16.
发表于 2019-03-08 19:03:37 回复(1)
啊没注意到时64位…
发表于 2019-07-29 12:07:34 回复(0)