[Investor Relations]  |  官方微博

C/C++培训

美国上市公司 · 亿元级外企Java培训企业

  • 全国服务监督电话400-827-0010
C++培训 > 资料库 > C++空类以及没有成员变量的类的大小
  • C++空类以及没有成员变量的类的大小

    发布:达内  来源:达内  时间: 2015年01月13日

  • C++空类以及没有成员变量的类的大小...

  • 关于C++中空类的大小为1,我们大家都有所了解,但是除了空类之外的其他一些没有成员变量的类的大小,还是有很多不明之处的。

    我们来看如下一个例子:

    #include

    using namespace std;

    class a {};

    class b{};

    class c :public a{

    virtual void fun() = 0;

    };

    class d :public b, public c{};

    int main()

    {

    cout << "sizeof(a)" << sizeof(a) << endl;

    cout << "sizeof(b)" << sizeof(b) << endl;

    cout << "sizeof(c)" << sizeof(c) << endl;

    cout << "sizeof(d)" << sizeof(d) << endl;

    getchar();

    return 0;

    }

    程序执行的输出结果为:

    sizeof(a)=1

    sizeof(b)=1

    sizeof(c)=4

    sizeof(d)=8

    为什么会出现这种结果呢?初学者肯定会很烦恼是吗?类a,b明明是空类,它的大小应该为为0,为什么 编译器输出的结果为1呢?这就是我们刚才所说的实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址,所以a,b的大小为1。

    而类c是由类a派生而来,它里面有一个纯虚函数,由于有虚函数的原因,有一个指向虚函数表的指针(vptr,有多个虚函数仍然是只有一个指针),在32位的系统分配给指针的大小为4个字节,所以最后得到c类的大小为4。

    类d的大小更让初学者疑惑吧,类d是由类b,c派生而来的,它的大小应该为二者之和5,为什么却是8呢?这是因为为了提高实例在内存中的存取效率,内存中会有数据对齐,于是类的大小往往被调整到4字节的整数倍。并采取就近的法则,往大的方向取最近的倍数,就是该类的大小,所以类d的大小为8个字节(假如d由3个空类和c派生而来,仍然是8)。

  • 上一篇:达内C语言:结构体的对齐原则

    下一篇:C++设计模试实现-State

网站导航
2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56