澳门新濠天地水舞间:类的大小

来源:百度文库 编辑:中财网 时间:2024/04/27 11:53:00
class Aclass
{
public:
Aclass();
virtual ~Aclass();
};
class B;
class A
{
B *b;
public:
A();
void        arrPara(int t[]);
static void        testmap();
static std::string        addSplit(std::string name[]);
};
class Base
{
public:
int k;
Base();
virtual ~Base();
virtual void func() = 0;
};
class User
{
public:
int id;
std::string name;
User();
virtual ~User();
operator bool() const {if (id) return true; return false;}
};
void sizeofAclass()
{
printf("size of class Base = %d\n", sizeof(Base));
printf("size of int = %d\n", sizeof(int));
printf("size of class User = %d\n", sizeof(User));
printf("size of class Aclass = %d\n", sizeof(Aclass));
printf("size of class A = %d\n", sizeof(A));
}
$ ./test
size of class Base = 8
size of int = 4
size of class User = 12
size of class Aclass = 4
size of class A = 4
class Aclass
{
public:
Aclass();
virtual ~Aclass();
};
复制代码
AClass的大小为4是因为你的析构函数被定义为虚拟的,这就引入了一个隐含的虚表指针成员,32位平台上,指针的大小为4字节;
当你将virtual ~Aclass改为~Aclass时,Aclass中就没有定义虚函数表,自然也就没有虚表指针成员了.这种情况下,由于你的类没有定义数据成员,也就是说他没有占据存储空间,但是由于当创建一个对象时,要标识一个对象,必须通过给它分配存储空间来引用对象,两者权衡之下,就给它分配了一个字节的存储空间.
class Aclass
{
public:
Aclass();
virtual ~Aclass();
};
复制代码
AClass的大小为4是因为你的析构函数被定义为虚拟的,这就引入了一个隐含的虚表指针成员,32位平台上,指针的大小为4字节;
当你将virtual ~Aclass改为~Aclass时,Aclass中就没有定义虚函数表,自然也就没有虚表指针成员了.这种情况下,由于你的类没有定义数据成员,也就是说他没有占据存储空间,但是由于当创建一个对象时,要标识一个对象,必须通过给它分配存储空间来引用对象,两者权衡之下,就给它分配了一个字节的存储空间.
上面的应当就是string类型的定义,它的尺寸应当为4字节.
其他的类的尺寸就是由它所包容的类的实例的尺寸一成一层累加起来的(考虑对齐因素);string的尺寸与与其相关联的存储区的大小没有关系.
Inside c++ object model里面有介绍;
placement new比较麻烦,得重载new delete new[] delete[],需求是如何产生的?