前言
一个空类的大小是多少? 0个字节还是一个字节?本节分析一个类的大小是多少, 怎么计算。 本节没有涉及类中有静态成员的情况, 后面会单独对静态成员做一个分析, 现在只要知道静态成员变量不在类的内存布局中。
环境
实验环境只要能编译运行的都可以, 只有86的环境指针的大小为4字节, 64环境指针大小是8字节。
一个空类的大小
一个空类也是有大小的, 其大小为1个字节。我们可以很简单的完成这个实验
class A{
}; A a;
cout << sizeof(a); // 1
但是需要明白的是为什么空类的大小是1, 而不是0, 这才是目的。
我们先来考虑如果大小是0. 如果空类实例化的对象的大小为0, 那么我们不管实例化多少个这样的对象都不会占内存, 反过来就是说空类的实例化并没有在内存中实际分配地址哦, 那是不是我们无法用指针指向这样的实例化。 指针无法指向空类实例化就有问题, 所以大小为0就是假命题。
实际上真正的原因是 : 一个空类在编译时会被编译器插入一个char字节的变量, 这只是使得空类在实例化时不同的实例化对象在内存中有独一无二的地址。 反过来可以说char用来标识类的不同实例化。
无虚指针的类的大小
一个类有了虚函数也就多了一个虚表, 我们先来分析没有虚函数时类的大小。
class A
{
int i, j;
};
class B
{
char ch;
int i;
};
class C
{
char ch1, ch2;
int i;
};
class D
{
char ch1;
int i;
char ch2;
};
类A的大小为8, 同样类B, C的大小也为8, 而类D的大小却为12.
在解释上面的例子之前要先明白什么时内存对齐。
1. 内存对齐