#include "stdio.h" #include "stdlib.h" #include <iostream> using namespace std; class Base { int a; char b; }; //sizeof(Base)=8 class Derive : public Base //基类全体被继承下来,包括padding { int c; char d; }; //sizeof(Derive)=16 class Derive1 : public Base //基类全体被继承下来,包括padding { //int c; char d; }; //sizeof(Derive)=12 class B {}; //sizeof(B)=1; class C:public B //基类若为空,继承的时候基类的1字节不用加下来 { char a; }; //sizeof(C)=1; class D { char a,b,c; }; //sizeof(D)=3; class E:public D //所以对于 class E & F : 并不是说D是3是一个整体成员,E与F的大小必须是3的倍数 { //其实只是简单的内存往下复制的操作. 并且上面说的倍数我感觉是仅仅针对 //简单数据类型的,人为定义组合的类型不在这个范畴中 char d; }; //sizeof(E)=4; class F { class D a; char e; }; //sizeof(F)=4; /* 所以 sizeof() 的要点总结如下: 1,简单数据结构组合的类,类的大小是其中最长数据类型大小的倍数 2,class t{}; 空类的size是1 3,有virtual的话 vitrual相当于有一个4字节的指针变量,也在倍数准则之内 4,加上继承之后 1)继承与组合(就是作为一个成员变量),在内存角度看来基本是一样的 2)继承下来的基类的内存是加上padding的,原样复制 (内存角度看) 3)而1准则这个东西,与4-2)是脱离的,大小倍数是根据其中的简单数据的大小来决定,与原样复制互不干扰 4)见Derive与Derive1两个类经典 5)若是2,空类继承, 子类没有父类的1字节数据 6)见class E, 继承下来的时候,还是要将父类结构拆分看作为多个简单结构 */ int main() { cout<<sizeof(Base)<<endl; cout<<sizeof(Derive)<<endl; cout<<sizeof(B)<<endl; cout<<sizeof(C)<<endl; cout<<sizeof(D)<<endl; cout<<sizeof(E)<<endl; cout<<sizeof(F)<<endl; int t; cin>>t; return 0; } 继承时候内存原本复制是因为存取一致(正确问题) 而扩充为结构的倍数是由于要做到cache对齐边界(效率问题) 两者侧重点不同