20170607_sizeof() 运算符的概念
剑指offer——P22
1、定义一个空的类,里面没有任何函数成员和数据成员。对该类的对象求sizeof(),结果是多少?
class A
{
};
A object;
答: sizeof(object)=1,占据1个字节,而不是0个字节。
对于空的类A 所生成的对象object,本来对它求sizeof() 应该是得到0个字节。但是,当我们生成这个对象的时候,编译器会在栈内存中给它保留一份儿空间,用来标识这个对象是属于这个类A 的,而不是属于其他的类B 的。
至于占用多大内存,这和具体的编译器有关,VS2012保留的1个字节空间。
2、如果在类A 中添加了一个构造函数和析构函数,那么再对它使用sizeof() 运算符,得到什么?
答:还是1个字节。每个类都会有默认的构造函数和析构函数,从这一点也说明了原因(和上题一样)。
另外,调用构造函数和析构函数只需要知道它们的函数地址就行了,而这些函数地址只和类型相关,和类的对象无关,编译器也不会因为这两个函数而给对象添加额外的内存,所有还是1个字节。
3、那如果把析构函数标识为虚函数呢?
答:C++编译器一旦发现类中含有虚函数(virtual function),便立即会给该类生成一个虚函数表(virtual table),并且对这个类的所有的对象都分别生成一个指向该虚函数表的虚函数指针(virtual function pointer)。
此外,这个虚函数表里面装的是指针,而这些指针是依次指向该类的所有虚函数的(一个指针对应一个虚函数,并且按照虚函数在类中定义的顺序)。
因此,如果把析构函数标识为虚函数,那么就会给该类的对象生成一个虚函数表指针,该指针大小就是这个空类的对象的大小。
32位机器上是4字节,64位机器上是8字节。