gpt4 book ai didi

c++ - 关于一个完全空的类

转载 作者:可可西里 更新时间:2023-11-01 16:47:47 32 4
gpt4 key购买 nike

#include <iostream>

using namespace std;

class Empty{
char omg[0];
};

int main()
{
Empty em1, em2;
Empty set[100];
cout << sizeof(Empty) << " " << sizeof(em1) << " " << sizeof(em2) << endl;
cout << (long*)&em1 << " " << (long*)&em2 << endl;

cout << "total numbers of element is: " << sizeof(set)/sizeof(*set) << endl;

return 0;
}

它的输出是:

0 0 0

0xbff36ad0 0xbff36ac8

numbers of elements is: 4

结果令人惊讶。

如上所示,Empty是一个类,它的大小和它的对象都是0,为什么?

可能是我猜的,因为一个空类的大小是1,当类不为空时,它的大小是由is成员决定的,但是这里它的成员比较特殊,是一个长度为零的数组,这个数组的大小为0,所以类和对象的大小都为0。

这只是我的猜测。随着程序的运行,我们可以看到两个对象都有地址,而且地址不同。

我的问题是:如果可以实现0大小的对象,为什么C++标准规定空对象的sizeof() = 1,是为了“保证两个不同对象的地址不同” Why is the size of an empty class not zero? , 但是现在,我们确实有不同的地址作为输出,这是怎么发生的?

再者,不管数组集的大小如何,最后一行输出的总是4,为什么?

谢谢:)

PS:我在MacOS上运行这个程序,编译器是Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)

最佳答案

我会试一试,因为没有人有经验:

As shown above, Empty is a class, the size of it and its objects are all 0, why?

标准禁止大小为零的数组,因此就标准而言,sizeof(Empty) 是一个无意义的表达式,您已经处于未定义行为的领域。

Here is my question: if object of 0 size can be implemented, [...] Why is the size of an empty class not zero? , but now, we do have different address as the output,how does this happen?

如上所述,大小为 0 的对象不能存在于有效的标准 C++ 程序中(基类 子对象 除外)。

您的编译器允许将此作为​​标准的扩展,并且只要您在预期的范围内使用此扩展(即作为预灵活数组成员 hack),您就不会有任何问题,尽管您的代码不可移植。然而,您上面的示例并不是零大小数组的使用方式(更不用说 c++ 中有更好的结构来处理这些情况)。

您的编译器足够智能,可以为 em1em2 提供单独的地址,但您应该发现 set 的所有元素实际上都有同一个地址。

Further more, no matter what the size of the array set is, the last line output is always 4, why?

由于您的编译器认为 sizeof(Empty)Empty 数组为零,因此您除以零,这是未定义的行为。如果禁用优化,您可能会发现程序崩溃,例如使用 GCC,您的程序会因 -O0 而不会因 -O1 而崩溃。

关于c++ - 关于一个完全空的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25804247/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com