这个情况情况比较复杂,举一个missgya的例子,在电脑上是C是8字节,也就是一个指向虚表的指针的大小,关于这个,再补充一点知识:
空类最常用于作为基类,那时候为了对齐实际可能占4个字节或以上。但这样会浪费空间,尤其是多重继承多个空基类的时候。所以编译器有空基类优化(empty base class optimization, EBCO)[1],令无非静态数据成员、无虚函数的基类实际占0字节。
因为BS大大当年说要确保两个不一样的对象拥有不同的地址---“To ensure that the addresses of two different objects will be different.” 就用那1byte来在内存中占用不同地址了。:)
又因为这些空class没有赋值的意义,所以就没必要占用更多内存。
普通的空类大小是1。如果有虚继承,则子类的大小会是4。
如下:
#include
using namespace std;
class A{};
class B : public A{};
class C : virtual public A{};
int main()
{
cout<< sizeof(A)<<< sizeof(B)< << sizeof(C)<
return 0;
}
这个问题有些奇葩,比如
class A
{};
class B
{char c;};
A是1,B也是1...那个1个字节只是让编译器识别不同的类用的......gcc 4.8测试...
另外加上虚继承的话情况更复杂,像missgya的例子,在我的机子上测试是C是8字节,也就是一个指向虚表的指针的大小,是操作系统相关的
空类(除了静态数据成员,没有任何其他数据成员的类)占一个字节
记得只能保证一定不是0。
通常情况下会是1,但是没有这个限制,所以最好不要依赖这个1来编写程序。