c ++中空类的行为

时间:2013-02-25 12:42:53

标签: c++

我写过这个小程序:

#include <iostream>

using namespace std;

class a{
};

int main ()
{
a *obj=new a();
cout<<sizeof(obj)<<endl;
cout<<sizeof(*obj)<<endl;
delete obj;
}

以下是我得到的输出:

> ./a.out
4
1
>

我可以理解它使用4个字节来存储对象的地址。 但我不明白的是1个字节。 因为它是一个空类,所以我怀疑这个1字节的目的是什么(对象的大小)。

我的第二个问题是是否会调用默认构造函数? 如果是的话它基本上会做什么?

4 个答案:

答案 0 :(得分:1)

字节在那里,因为在C ++中对象的大小不能是0。这是一个虚拟字节。考虑一组a - 如果a的大小为0,则所有对象都位于同一地址。

理论上,调用一个空的默认构造函数。在实践中,它被优化了,因为它没有可观察到的行为。

答案 1 :(得分:0)

第一个sizeof在32位系统中输出32位指针的大小。第二个sizeof打印出a内容的大小,该内容与1个字节对齐,因为不同的对象必须在不同的地址中创建。

但是,即使使用非虚拟方法

,您也可以使用零大小类
class A
{
    A()
    {
       cout << "Hi" << endl;
    }
    char unused[];
    // Note: Putting at least a virtual method increases the size to 4 bytes.
};

cout << sizeof(A) << endl; // Prints out 0

此外,此代码显示所有A个对象位于相同的内存地址中:

A a1;
A a2;

cout << &a1 << endl;
cout << &a2 << endl;

输出:

  

0x22ff00

     

0x22ff00

答案 2 :(得分:0)

每个对象必须具有不同的地址,因此C ++中的对象的最小大小为1.

默认构造函数不执行任何操作。

答案 3 :(得分:0)

  

该1字节(对象大小)的目的是什么

在C ++中,所有不同的对象必须具有不同的地址。为了实现这一点,所有对象至少与最小可寻址单元一样大 - 即一个字节。

  

我的第二个问题是是否会调用默认构造函数?

技术上,是的。如果您没有声明自己的默认构造函数,那么如果需要,将隐式生成一个构造函数。隐式构造函数将默认构造所有成员和基础子对象。然而...

  

如果是,它基本上会做什么?

由于该类没有需要初始化的成员或子对象,因此隐式构造函数琐事:它什么都不做。