- 论坛徽章:
- 0
|
- class Aclass
- {
- public:
- Aclass();
- virtual ~Aclass();
- };
复制代码
AClass的大小为4是因为你的析构函数被定义为虚拟的,这就引入了一个隐含的虚表指针成员,32位平台上,指针的大小为4字节;
当你将virtual ~Aclass改为~Aclass时,Aclass中就没有定义虚函数表,自然也就没有虚表指针成员了.这种情况下,由于你的类没有定义数据成员,也就是说他没有占据存储空间,但是由于当创建一个对象时,要标识一个对象,必须通过给它分配存储空间来引用对象,两者权衡之下,就给它分配了一个字节的存储空间.
- class User
- {
- public:
- int id;
- std::string name;
-
- User();
- virtual ~User();
-
- operator bool() const {if (id) return true; return false;}
- };
复制代码
你可以这样考虑,对于普通的类型的成员,比如所int,double,float等,它占据的尺寸是该类型变量所对应的大小与与编译器相关的地址对齐的综合效果,
如果是一个某一类型的指针或引用类型的变量,它的大小在32位平台上就是4个字节.
任何一个类,最终总要归结到这些基础数据类型上去.
比如string类,要实现它的功能,它里面就定义了一个char*类型的指针,指向数据存储区.
- class string
- {
- private:
- char* data; //某一个缓冲区的指针
- }
复制代码
上面的应当就是string类型的定义,它的尺寸应当为4字节.
其他的类的尺寸就是由它所包容的类的实例的尺寸一成一层累加起来的(考虑对齐因素);string的尺寸与与其相关联的存储区的大小没有关系.
Inside c++ object model里面有介绍;
placement new比较麻烦,得重载new delete new[] delete[],需求是如何产生的? |
|