类的⼤⼩计算
类对象的⼤⼩
确切的说,类只是⼀个类型定义,它是没有⼤⼩可⾔的。 ⽤sizeof运算符对⼀个类型名操作,得到的是具有该类型实体的⼤⼩。(注意不要说类的⼤⼩,是类的对象的⼤⼩.)
C++标准规定类的⼤⼩不为0,空类的⼤⼩为1,当类不包含虚函数和⾮静态数据成员时,其对象⼤⼩也为1。 如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会⾃动在对象⾥安插⼀个指针指向虚函数表VTable,在32位机器上,⼀个对象会增加4个字节来存储此指针,它是实现⾯向对象中多态的关键。⽽虚函数本⾝和其他成员函数⼀样,是不占⽤对象的空间的
空类
什么是空类
class Student
{
};
通过利⽤sizeof求解,可以知道上述Student类的⼤⼩为1,那么很多⼈就会疑惑了,明明这个类中什么都没有,那么它的⼤⼩为什么是1⽽不是0呢?
实际上,这是类结构体实例化的原因,空的类或结构体同样可以被实例化,如果定义对空的类或者结构体取sizeof()的值为0,那么该空的类或结构体实例化出很多实例时,在内存地址上就不能区分该类实例化出的实例,所以,为了实现每个实例在内存中都有⼀个独⼀⽆⼆的地址,编译器往往会给⼀个空类隐含的加⼀个字节,这样空类在实例化后在内存得到了独⼀⽆⼆的地址,所以空类所占的内存⼤⼩是1个字节。
⼀般的类
class base1
{
private:
char a;
int b;
double c;
};
class base2
{
private:
char a;
double b;
int c;
};
base 1类对象的⼤⼩为16字节,⽽base 2类对象的⼤⼩为24字节,因为不同的声明顺序,居然造成了8字节的空间差距,因此,我们将来在⾃⼰声明类时,⼀定要注意到内存对齐问题,优化类的对象空间分布。
class Base
{
private:
char a;
public:
virtual void f();
virtual void g();
};
class Derived:public Base {
private:
实例化类和实例化对象int b;
public:
void f();
};
class Derived1:public Base {
private:
double b;
public:
void g();
virtual void h();
};
类的⼤⼩与什么有关系与类⼤⼩有关的因素:普通成员变量,虚函数,继承(单⼀继承,多重继承,
重复继承,虚拟继承)与类⼤⼩⽆关的因素:静态成员变量,静态成员函数及普通成员函数总结类的⼤⼩为类的⾮静态成员数据的类型⼤⼩之和.由编译器额外加⼊的成员变量的⼤⼩,⽤来⽀持语⾔的某些特性(如:指向虚函数的指针).为了优化存取效率,进⾏的边缘调整(类似于结构体的内存对齐)与类中的构造函数,析构函数以及其他的成员函数⽆关.⼀个类中,虚函数、成员函数(包括静态与⾮静态)和静态数据成员都是不占⽤类对象的存储空间的。对象⼤⼩= vptr+ 所有⾮静态数据成员⼤⼩ + Aligin字节⼤⼩(依赖于不同的编译器)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论