一、空类大小
class A
{
};
void main()
{
A a;
cout <<"sizeof(a):"<< sizeof(a) << endl;
system("pause");
}
结果:
从结果可以看出,空类的大小是1,这是为了空类可以被实例化,并且每个实例在内存中都有独一无二的地址,因此,编译器会给空类隐含加上一个字节,这样空类实例化之后就会拥有独一无二的内存地址。如果没有这一个字节的占位,那么空类就无所谓实例化了,因为实例化的过程就是在内存中分配一块地址。
注意:当该空白类作为基类时,该类的大小就优化为0了,这就是所谓的空白基类最优化。
注意:空白基类最优化无法被施加于多重继承上只适合单一继承。
class A
{
};
class B :public A
{
};
void main()
{
A a;
cout <<"sizeof(a):"<< sizeof(a) << endl;
B b;
cout << "sizeof(b):" << sizeof(b) << endl;
system("pause");
}
结果:
二、成员函数对类大小的影响
class A
{
public:
void go()
{
}
void go1()
{
}
void go2()
{
}
};
void main()
{
A a;
cout <<"sizeof(a):"<< sizeof(a) << endl;
system("pause");
}
结果:
从结果可以看出,成员函数不占用类对象的空间
三、成员非静态变量对类对象空间大小的影响
class A
{
public:
void go()
{
}
void go1()
{
}
void go2()
{
}
int ax;
};
void main()
{
A a;
cout <<"sizeof(a):"<< sizeof(a) << endl;
a.ax = 100;
system("pause");
}
结果:
从结果可以看出非静态变量占用空间。
四、静态变量对类对象大小的影响
class A
{
public:
void go()
{
}
void go1()
{
}
void go2()
{
}
static int x;
};
int A::x = 1;
void main()
{
A a;
cout << sizeof(a) << endl;
system("pause");
}
结果:
从结果可看出,静态成员变量部占用类对象的空间。
五、虚函数对类对象大小的影响
class A
{
public:
void go()
{
}
void go1()
{
}
void go2()
{
}
virtual void go3()
{
}
};
void main()
{
A a;
cout << sizeof(a) << endl;
system("pause");
}
结果:
从结果可以看出加入了虚函数会增加四个字节,其实这四个字节就是指向虚函数表的指针(VPTR)