看到阿里的一道笔试题:
#pragma pack(2) class A { int i; union U { char buff[13]; int i; }u; void foo() { } typedef char* (*f)(void*); enum{red, green, blue} color; }a;
答案应该是多少呢:24
因为对于u,占用的内存是16个字节,刚开始看这题的时候以为是14个字节,因为u要设定为每一个类型的整数倍,且能容纳类型变量字节的最大值
既然这样,我们顺便来总结一下c++中类的内存大小:
这是一个总结:
#include <iostream> #include <iomanip> using namespace std; class A1//c++要求每个实例在内存中都有独一无二的地址,空类也会被实力化,编译器自动添加一个字节 {}; class A2 { int a; char p; }; class A21//所有类型都小于处理器的大小,优化为最大类型的整数倍 { int a; char b; char c[6]; }; class A22//单个字符存储,不会优化 { char b; char c[5]; }; class A23//double大于处理器位数,以处理器位数对齐 { int a; double b; char c[2]; char d[7]; }; class B//含有虚函数的类中自动维护一个指向虚函数表的指针,大小为4字节 { public: B(){} virtual ~B(){} private: int a; char *b; }; class C: public B { public: C(){} ~C(){} virtual void func();//父类和子类共享一个 vptr,而不管虚函数的个数 private: int x; }; int main() { cout<<"A1:"<<setw(4)<<sizeof(A1)<<endl; cout<<"A2:"<<setw(4)<<sizeof(A2)<<endl; cout<<"A21:"<<setw(4)<<sizeof(A21)<<endl; cout<<"A22:"<<setw(4)<<sizeof(A22)<<endl; cout<<"A23:"<<setw(4)<<sizeof(A23)<<endl; cout<<"B:"<<setw(4)<<sizeof(B)<<endl; cout<<"C:"<<setw(4)<<sizeof(C)<<endl; return 0; }
对于c++关于继承层次的内存布局,准备去看《inside the c++ object module》