我们在编写代码的过程中,常常会自定义类并进行实例化对象来完成我们的需求,这也是我们常说的面向对象编程。
而在我们编写代码的过程中,其实往往会忽视一个十分重要并且“有趣”的问题,就是每个类的大小是多少呢?
一个非常直观的感觉就是一个类的大小是由类的非静态成员变量决定的。而这句话其实只有在某些情况下是正确的。
第一个例子:
class A{
public:
A()=default;
char a;
int b;
char c;
};
请问A的大小是多少呢?一个最简单的答案是6个字节,因为char类型的大小是一个字节,int类型的大小是四个字节。
但这个答案一般情况下是不对的。我在自己电脑上跑出来的结果是12字节。这是为什么呢?这是因为在处理器实际分配内存的时候会考虑内存对齐的问题。
内存对齐有三个规则:
1. 非成员变量的对齐一般就是它的sizeof的值。
2. 对于类或者结构体内的变量还需要进行额外一次对齐。对齐的大小是由系统默认的对齐大小和类中sizeof值最大的成员变量共同决定的,取两者中的更小者。
3. 当类的每个成员变量计算完毕后,类的大小还必须满足是类中最大成员变量的整数倍。
根据这三个规则来分析A
class A{
public:
A()=default;
char a; //1字节 //根据规则2,1->4
int b; //4字节 //根据规则2,4不变
char c;//1字节 //根据规则2,1->4
};
//class A根据规则1和2计算大小为12,符合规则3 故classA大小就是12
除此之外,类的大小还需要考虑虚函数和继承。