// 对齐原则:每一成员需对齐为后一成员类型的倍数
// 补齐原则:最终大小补齐为成员类型最大值的倍数
#include <iostream> #include <memory> #include <string> using namespace std; // 空类,考虑的是当我们声明该类型的实例时候,它必须在内存中 // 有一定的空间,否则就是不存在的,导致无法使用这些实例 class A { A() {}; }; // 虚函数的大小为4 字节对齐 class B { B() {}; virtual void func() {}; }; /* 4字节 int 4 4 short 2 4+2=6 6不是下一个字节4的倍数,6+2=8 int 4 8+4=12 12是下一个字节1的倍数 char 1 12+1=13 13补齐为4的倍数 */ struct C { int a; short b; int c; char d; }; /* 4字节 int 4 4 是下一个字节1的倍数 short 2 4+2=6 是下一个字节1的倍数 char 1 6+1=7 不是下一个字节4的倍数 7+1=8 int 4 8+4=12 是4的倍数 */ struct D { int a; short b; char c; int d; }; int main() { cout<<"class: "<<sizeof(A)<<endl; cout<<"class: "<<sizeof(B)<<endl; cout<<"struct: "<<sizeof(C)<<endl; cout<<"struct: "<<sizeof(D)<<endl; return 0; }
