空类的sizeof,有一个虚函数的类的sizeof

来源:互联网 发布:外贸数据分析 编辑:程序博客网 时间:2024/05/16 06:27


题目(二):运行下面的代码,输出是什么?

class A

{

};

class B

{

public:

        B() {}

~B() {}

};

class C

{

public:

        C() {}

        virtual ~C() {}

};

int _tmain(int argc, _TCHAR* argv[])

{

        printf("%d, %d, %d\n",sizeof(A), sizeof(B),sizeof(C));

        return 0;

}

 

答案是1, 1, 4class A是一个空类型,它的实例不包含任何信息,本来求sizeof应该是0。但当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。至于占用多少内存,由编译器决定。Visual Studio 2008中每个空类型的实例占用一个byte的空间。

 

class Bclass A的基础上添加了构造函数和析构函数。由于构造函数和析构函数的调用与类型的实例无关(调用它们只需要知道函数地址即可),在它的实例中不需要增加任何信息。所以sizeof(B)sizeof(A)一样,在Visual Studio 2008中都是1

 

class Cclass B的基础上把析构函数标注为虚拟函数。C++的编译器一旦发现一个类型中有虚拟函数,就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针。在32位的机器上,一个指针占4个字节的空间,因此sizeof(C)4

0 0
原创粉丝点击