注:以下测试,均是在#pragma pack(4)的情况下编译的.
1.首先,空类的大小并不是0,而是1!
#include <iostream>
using namespace std;
//内存对齐的方式是以4个字节为一组.
#pragma pack(4)
class A
{
};
int main()
{
A s;
int i = sizeof(s);//1
system("pause");
return 0;
}
2.int, float为4个字节,double为8个字节.
3.普通函数不占内存.
#include <iostream>
using namespace std;
#pragma pack(4)
class A
{
void f(){}
};
int main()
{
A s;
int i = sizeof(s);//内存为1个字节.
system("pause");
return 0;
}
4.有虚函数或作为单继承的子类.一般4个字节.(不同环境不同.)
#include <iostream>
using namespace std;
#pragma pack(4)
class A
{
int a;//4
char b;//4 由于内存对齐的关系,即使不满4个字节,也要占据4个字节的大小.如果后面还有个short成员变量,则依旧占据4个字节.
virtual void f(){}//4
};
int main()
{
A s;
int i = sizeof(s);
system("pause");
return 0;
}
原来有虚函数的类,都是由一个虚指针去指向一个叫做虚表的东西,所以虚函数本身是不占内存的,只是虚指针的大小为4个字节.但是,在单继承中,即使有多个虚函数,仍然只有一个虚指针!!!依旧为4个字节.
5.有虚函数的多继承.
#include <iostream>
using namespace std;
#pragma pack(4)
class B
{
virtual void init(){}
};
class C
{
virtual void init_2(){}
};
class A : public B ,public C
{
int a;
char b;
virtual void show(){}
};
int main()
{
A s;
int i = sizeof(s);//16个字节,两个虚指针共8字节,int对象4个字节,char对象由于对齐占据4个字节.
system("pause");
return 0;
}
我们可以看到对象s中,含有从类B中的虚指针,从类C中的虚指针,剩下两个变量.