1.基本类型的sizeof
2.指针sizeof
指针记录了另一个对象的地址,等于计算机内部地址总线的宽度。而且指针变量的sizeof值与指针所指的对象没有任何关系,所以在32位计算机中,一个指针变量的返回值必定是4字节
char* pc = "abc";
int* pi;
string* ps;
char** ppc = &pc;
void (*pf)(); // 函数指针
sizeof( pc ); // 结果为4
sizeof( pi ); // 结果为4
sizeof( ps ); // 结果为4
sizeof( ppc ); // 结果为4
sizeof( pf ); // 结果为4
3.结构体sizeof
-
字节对齐
原则:所有的成员在分配内存时都要与所有成员中占内存最多的数据类型所占内存空间的字节数对齐。
注意:这里时最多的数据类型,而不是最多的数据。
-
具体参考
4.类sizeof
-
公式:
对象大小 = 虚函数指针(多个虚函数也只有一个指针,指向虚函数表) + 所有非静态数据成员大小 + 因对齐而多占的字节
-
空类
空类型的实例不包括任何信息,本来求sizeof应该是0,但是我们在声明该类型实例的时候,必须给实例在内存中分配一定的空间,否则无法使用该实例。由于空类型不含任何信息,故而所占的内存大小由编译器决定,一般占1Byte。
-
虚函数
如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针指向虚函数表VTable,在32位机器上,一个对象会增加4个字节来存储此指针
-
成员函数、构造函数、析构函数
成员函数(包括静态与非静态)不占用类对象的存储空间
-
静态成员变量
由于静态成员变量不在对象中存储,因此不占用类对象的存储空间