1.须知
类本身是没有大小的。
类的大小指的是类的对象所占的大小。
如果用 sizeof 运算符对一个类型名操作,得到的是具有该类型实体的大小。
2.空类对象所占用的空间大小
#include <iostream>
using namespace std;
class A
{
};
int main()
{
A obja;
cout << sizeof(obja) << endl; // 1
return 0;
}
C++标准指出,不允许一个对象的大小为
0
0
0,不同的对象不能具有相同的地址。这是由于:
- new 需要分配不同的内存地址,不能分配内存大小为
0
0
0 的空间
- 避免除以 sizeof(T) 时出现除以
0
0
0 的错误
因此,空类对象所占用的空间大小为
1
1
1,其原因是让对象的实例能够相互区别。从上面代码可以看出,空类同样能够被实例化,所以编译器会给空类隐含地添加
1
1
1 个字节,这样空类实例化之后就会拥有独一无二的内存地址。
当然,一旦空类中有其他的占用空间的成员,那么这
1
1
1 个字节就不计算在内了。
例如,一个类中只有一个 int
,则其占用
4
4
4 字节而不是
5
5
5 字节。
#include <iostream>
using namespace std;
class A
{
int x;
};
int main()
{
A obja;
cout << sizeof(obja) << endl; // 4
return 0;
}
3.一个类继承空类
当一个类继承空类时,空基类的
1
1
1 个字节并不会加到子类中去。
#include <iostream>
using namespace std;
class A
{
};
class B : public A
{
};
int main()
{
A obja;
cout << sizeof(obja) << endl; // 1
B objb;
cout << sizeof(objb) << endl; // 1
return 0;
}
#include <iostream>
using namespace std;
class A
{
};
class B : public A
{
int x;
};
int main()
{
A obja;
cout << sizeof(obja) << endl; // 1
B objb;
cout << sizeof(objb) << endl; // 4
return 0;
}
4.空类作为另一个类的成员
当空类作为另一个类的成员时,空类的
1
1
1 个字节会被计算在内。
然而,你会发现下面代码在大多数编译器中 B
类对象所占用的空间大小为
8
8
8。这是由于空类对象的大小虽然为
1
1
1,但是为了内存对齐,编译器会额外加上一些字节,使其被放大到足够可以存放一个 int
。
#include <iostream>
using namespace std;
class A
{
};
class B
{
int x;
A a;
};
int main()
{
A obja;
cout << sizeof(obja) << endl; // 1
B objb;
cout << sizeof(objb) << endl; // 8
return 0;
}