标签:style blog http color get width
关于C++中空类的大小为1,我们大家都有所了解,但是除了空类之外的其他一些没有成员变量的类的大小,还是有很多不明之处的。
我们来看如下一个例子:
#include<iostream> 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)。
当然在不同的编译器上得到的结果可能不同,但是这个实验告诉我们,不管类是否为空类,是否有成员变量,这个类在创建对象的时候都是需要分配空间的(sizeof的作用见我另外一篇博文:http://www.cnblogs.com/yanqi0124/p/3796736.html)。
参考地址:http://blog.csdn.net/hitblue/article/details/3726754
C++空类以及没有成员变量的类的大小,布布扣,bubuko.com
标签:style blog http color get width
原文地址:http://www.cnblogs.com/yanqi0124/p/3796906.html