事实上说一个类有多大有点不太严谨,真要说大小的话应该是针对类的实例。这里我们看几个例子。由于内存对齐的原因,一个类的真实大小并不是简单的将其中变量的大小简单相加。
这里我给出一个例子: linux = ubuntu 18.04 windwos = windows10
class Bar {
int a;
char c;
double b;
};
// linux32 16B linux64 16B
// windows32 16B windows64 16B
class Foo {
int a;
double b;
char c;
};
// linux32 16B linux64 24B
// windows32 24B windows64 24B画出来大概就是这样
首先,在默认情况下,各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。而且,当最后一个变量所占内存如果没有上一个变量大,那么它占的内存会和上一个变量一样。譬如:
class Foo {
int b;
char d[5];
double a[3];
char c;
};
// 48 B最后,这条规则在 linux32 中并不成立,4 成了偏移量的基准。在不同的系统和编译器下,这个实验的值存在区别。
注:如果类使用了虚函数,那么类的大小就需要加上 8Byte,因为有了一个 vptr 指向 vtable