【问题标题】:Behaviour of an empty class in c++ [duplicate]C ++中空类的行为[重复]
【发布时间】:2013-02-10 14:43:08
【问题描述】:

我写了这个小程序:

#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 字节(对象的大小)的目的是什么。

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

【问题讨论】:

标签: c++


【解决方案1】:

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

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

【讨论】:

  • 我看不出空数组如何暗示相同的地址。您可以在不同的地址有空对象...
  • @infact 我从来没有说过空数组...
  • @lucian..u 关于第二个可能是正确的,但第一个..我猜是错的。顺便说一句,我没有反对:)
  • 这只是我的猜测,别担心......我也可能是错的。链接说它是因为你从未提到过的地址。
  • @sarathi “如果 a 的大小为 0,所有对象都将位于同一地址”。部分?
【解决方案2】:

首先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

【讨论】:

  • 这个答案与提出的问题无关。
  • @sarathi 不相关?为什么?
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

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

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

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

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

    【讨论】:

    • 否决票的任何理由?我相当确定我的答案是正确的,尽管它可能掩盖了一些无关紧要的细节,例如空基类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2020-12-18
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    相关资源
    最近更新 更多