-2

我写了这个小程序:

#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

4 回答 4

1

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

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

于 2013-02-25T12:44:52.647 回答
0

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

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

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

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

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

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

于 2013-02-25T12:56:47.990 回答
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

于 2013-02-25T12:45:17.990 回答
0

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

默认构造函数什么都不做。

于 2013-02-25T12:45:50.647 回答