说明:
1、空类 总是返回 1
原因:类要创建对象,要预留空间;最小的内存单位为 1;
(类的实例化就是在内存中分配一块地址,每个实例在内存中都有独一无二的地址)
2、类 跟 struct一样 需要考虑对齐和补齐的问题
3、类中含有 static 成员 sizeof不计其大小
原因:因为static成员是分配在全局区为类的所有对象共享
4、带virtual函数时
单继承情况下,只要class中存在virtual函数,编译器在编译时就会自动插入一个指向虚函数表的指针vptr. 不同的编译器vptr插入的位置可能不同
也需要考虑基类的对齐和补齐
5、继承 不带 virtual 函数
子类的大小 需要加上基类的部分
6、继承 带 virtual 函数
子类的大小 需要加上基类的部分 还需要加上 vptr(指向虚函数表的指针)大小
实例代码:----说明 <64位---指针的大小为8> CentOS release 5.6 (Final)
#include <iostream>
using namespace std;
class A{};
class B{
public:
int m_n;
double m_f;
static int m_sn;
};
int B::m_sn = 0;
class C{
public:
int m_n;
double m_f;
virtual void foo(){}
};
class D{
private:
int m_n;
double m_f;
};
class E:public A{
private:
int m_n;
};
class F:public D{
private:
int m_n;
};
class G{
private:
int m_n;
};
class H:public C{
private:
int m_n;
};
int main(void)
{
cout<<sizeof(A)<<endl;
cout<<sizeof(B)<<endl;
cout<<sizeof(C)<<endl;
cout<<sizeof(D)<<endl;
cout<<sizeof(E)<<endl;
cout<<sizeof(F)<<endl;
cout<<sizeof(G)<<endl;
cout<<sizeof(H)<<endl;
return 0;
}
执行结果:
1
16
24
16
4
24
4
32