1. 类对象所占用的空间大小
case1:空类中,类对象占用一个字节
#include <iostream>
using namespace std;
class Person
{
public:
};
int main()
{
Person p1;
int size = sizeof(p1); //sizeof(p1) = 1, 空类对象p1存在首地址,占用一个字节
cout << size << endl;
}
case2: 类中的成员函数不占用类对象的内存空间
#include <iostream>
using namespace std;
class Person
{
public:
static void func(){} //静态成员函数
void func2(){} //非静态成员函数
void func3(){}
};
int main()
{
Person p1;
int size = sizeof(p1); //sizeof(p1) = 1, 类的成员函数不占用类对象的内存空间
cout << size << endl;
}
case3: 类中的静态成员变量不占用类对象的内存空间
#include <iostream>
using namespace std;
class Person
{
public:
static int a;
};
int main()
{
Person p1;
int size = sizeof(p1); //sizeof(p1) = 1,静态成员变量不占用类对象的存储空间
cout << size << endl;
}
case4: 类中的非静态成员变量占用类对象的内存空间
#include <iostream>
using namespace std;
class Person
{
public:
char c;
};
int main()
{
Person p1;
int size = sizeof(p1); //sizeof(p1) = 1,char类型变量占用类对象的一个字节
cout << size << endl;
p1.c = 'c'; //执行到该步,p1地址上的值由0变为63(十六进制),即99(十进制) = 'c'的值,证明成员变量c占用了类对象的内存
}
#include <iostream>
using namespace std;
class Person
{
public:
int a;
};
int main()
{
Person p1;
int size = sizeof(p1); //sizeof(p1) = 4,int类型变量占用类对象的4个字节
cout << size << endl;
p1.a = 12; //执行到该步,p1地址上的值由0变为c(十六进制),即12(十进制),证明成员变量a占用了类对象的内存
}
case5: 类中有多个数据成员时,为了提高访问效率,有些编译器会将成员间的内存占用比例进行调整(内存字节对齐)
#include <iostream>
using namespace std;
class Person
{
public:
char a;
int b;
};
int main()
{
Person p1;
int size = sizeof(p1); //sizeof(p1) = 8,
cout << size << endl;
}
case6: 类中的指针变量均占用类对象内存空间的4(Windows)或8个字节(Linux)#####
#include <iostream>
using namespace std;
class Person
{
public:
char* a;
int* b;
double* c;
};
int main()
{
Person p1;
int size = sizeof(p1); //sizeof(p1) = 24, 不管什么类型的指针,其占用类对象的内存空间是固定的,每个指针占4(Windows)或8(Linux)个字节
cout << size << endl;
}
case7: 类中存在虚函数,无论几个,均占类对象的一个指针字节大小,[4(Windows)或8个字节(Linux)]
#include <iostream>
using namespace std;
class Person
{
public:
virtual void func1(){}
virtual void func2(){}
virtual void func3(){}
};
int main()
{
Person p1;
int size = sizeof(p1); //sizeof(p1) = 8,类中存在虚函数,无论几个,均占类对象的一个指针字节大小(linux=8,windows=4)
cout << size << endl;
}
结论:
- 一个类对象至少占用1个字节的内存空间。
- 成员函数不占用类对象的内存空间。
- 静态成员变量不占用类对象的内存空间。(静态成员变量和类对象无关,其不保存在类对象内部,保存在对象外面,因而不占用类对象的内存空间)
- 非静态成员变量占用类对象的内存空间。(非静态成员变量保存在对象内部,占用类对象的内存空间)
- 成员函数无论静态非静态,全部保存在类对象外,不占用类对象的内存空间.
- 虚函数不保存在类对象中,但是虚函数会占用类对象的一个指针字节以容纳虚函数表指针(vptr).
- 虚函数表[vtbl]是基于类的,跟着类走,与类对象无关.
8.类对象大小的组成=类中非静态成员变量所占用的内存和(考虑字节对齐) + 虚函数表指针