c++中一个空类的行为

Behaviour of an empty class in c++

本文关键字:一个 c++      更新时间:2023-10-16

我写了一个小程序:

#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++中对象的大小不能是0。它是一个伪字节。想象一下a的数组——如果a的大小是0,那么所有对象都将位于同一地址。

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

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

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

1字节(对象大小(的用途是什么

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

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

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

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

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

First 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