class struct 内存对齐
原则:
1、每个成员相对于这个结构体变量地址的偏移量正好是该成员类型所占字节的整数倍
2、struct最终占用字节数为成员类型中最大占用字节数的整数倍
struct内存对齐
Demo1:占用17字节,由于必须是8的整数倍,所以实际占用24字节
struct Stu
{
int id; // 占用0~3
double d; // 占用8~15
char c; // 占用16
};
Demo2:占用16字节,是8的整数倍,实际占用16字节
struct vpoet
{
char c; // 占用0
int id; // 占用4~7
double d; // 占用8~15
};
总结:struct占用内存与元素顺序有关,建议按单个元素占用空间大小合理排序
class内存对齐
Demo1:空类占用1字节
class Empty
{
}
Demo2:虚函数占用一个指针的空间(参考博主:多继承和虚继承 & 虚函数),以下占用12字节(参考struct内存对齐机制)
class CBase
{
public:
CBase(void);
virtual ~CBase(void);
private:
int a;
char *p;
};
Demo3:子类大小等于父类大小+子类成员大小(16字节)
class CChild : public CBase
{
public:
CChild(void);
~CChild(void);
private:
int b;
};
Demo4:静态数据成员被编译器放在程序的一个global data members中,它是类的一个数据成员.但是它不影响类的大小(8字节)
class A
{
int a;
static int b;
virtual void FuncA();
};