C++中一个对象到底占用多少内存?
1.前言
这个问题对于开发可能不是那么的关注,但是其实在C++相关的题中却经常出现,下面将针对性的记录说明下这个问题
2.直蹦主题
2.1 重要结论
1)非静态成员函数的总和
2)考虑CPU的运算,不同大小的变量,会按最大类型以单位采取对齐策略,
3)当存在虚函数时建立虚函数表会增加额外的内存开销
2.2 测试说明
根据以上结论,下面进行测试,更容易理解:
// 无成员函数和成员变量,由于对象地址的独立性,也将占有1字节
class TestSize0
{
};
// 拥有成员函数: 成员函数们不占用内存,还是一字节
class TestSize1
{
public:
TestSize1();
~ TestSize1();
void fun1() {};
void fun2() {};
};
// 拥有一个int成员变量: int占4字节
class TestSize2
{
public:
TestSize2();
~TestSize2();
int i2;
};
// 拥有一个int和一个char成员变量,将对齐 4 + 4 = 8
class TestSize3
{
public:
TestSize3();
~TestSize3();
int i3;
char c3;
};
// 拥有一个int和两个个char成员变量,将对齐 4 + 4 = 8
class TestSize4
{
public:
TestSize4();
~TestSize4();
int i4;
char c4, c42; // 对齐后为4足以存下两个char
};
// 含有虚函数将额外的增加内存(虚函数表),具体大小同编译器相关吧,我这个为8
class TestSize5
{
public:
TestSize5();
~TestSize5();
virtual void fun() {};
};
// 含有两个虚函数的,并不是加个虚函数就得加内存,还是输出8
class TestSize6
{
public:
TestSize6();
~TestSize6();
virtual void fun1() {};
virtual void fun2() {};
};
// 这个呢? 3 * 8 = 24
class TestSize7
{
public:
TestSize7();
~TestSize7();
void fun1() {};
virtual void fun2() {}; // 8
int i7; // 4→8(还剩下4没用)
char c7[5]; // 5→8 (int多出来的4存不下,必须重新拿下个8)
};
// 含有的静态成员不占用栈内存: 8 * 2 = 16
class TestSize8
{
public:
TestSize8();
~TestSize8();
void fun1() {};
virtual void fun2() {}; // 8
static int i8; // 静态不占用栈内存
char c8[5]; // 5→8
};
int main()
{
cout << "无成员函数和成员变量的空类 TestSize0:" << sizeof(TestSize0) << endl;
cout << "含有成员函数的类 TestSize1:" << sizeof(TestSize1) << endl;
cout << "含有一个int成员变量的类 TestSize2:" << sizeof(TestSize2) << endl;
cout << "含有一个int和char成员变量的类 TestSize3:" << sizeof(TestSize3) << endl;
cout << "含有一个int和两个char成员变量类 TestSize4:" << sizeof(TestSize4) << endl;
cout << "含有一个虚函数的类 TestSize5:" << sizeof(TestSize5) << endl;
cout << "含有两个虚函数的类 TestSize6:" << sizeof(TestSize6) << endl;
cout << "练习一下呢 TestSize7:" << sizeof(TestSize7) << endl;
cout << "含有静态成员 TestSize8:" << sizeof(TestSize8) << endl;
system("pause");
return 0;
}
测试结果:
3.最后
以上就是针对这个问题的比较针对性的回答,其中还有些原理性,另外还有针对基类的相关问题没有阐述,下次再说吧,如有问题还请联系修正!
参考链接:
C++一个类的内存占用情况