gpt4 book ai didi

c++ - 这个结构怎么会有 sizeof == 0?

转载 作者:IT老高 更新时间:2023-10-28 12:03:52 26 4
gpt4 key购买 nike

有一篇旧帖子要求 sizeof 将返回 0 的构造。有一些来自高声誉用户的高分回答说,按照标准,没有类型或变量的大小可以为 0。我 100% 同意这一点。

但是有this new answer它提出了这个解决方案:

struct ZeroMemory {
int *a[0];
};

我正要投反对票并发表评论,但在这里度过的时间教会我检查即使是我 100% 确定的事情。所以……令我惊讶的是,gccclang 都显示了相同的结果:sizeof(ZeroMemory) == 0。更重要的是,变量的 sizeof 是 0:

ZeroMemory z{};
static_assert(sizeof(z) == 0); // Awkward...

哇……?

Godbolt link

这怎么可能?

最佳答案

在 C 被标准化之前,只要代码从未尝试从另一个指针中减去一个指向零大小类型的指针,许多编译器就可以轻松处理零大小类型。这些类型很有用,支持它们比禁止它们更容易也更便宜。然而,其他编译器决定禁止这种类型,并且一些静态断言代码可能依赖于这样一个事实,即如果代码试图创建一个大小为零的数组,它们会发出尖叫声。该标准的作者面临着一个选择:

  1. 允许编译器静默接受大小为零的数组声明,即使如果此类声明的目的是触发诊断和中止编译,并要求所有编译器接受这样的声明(尽管不一定是默默地)产生零大小的对象。

  2. 允许编译器静默接受大小为零的数组声明,即使如果此类声明的目的是触发诊断和中止编译,并允许编译器遇到此类声明中止编译或在空闲时继续编译。

  3. 如果代码声明了大小为零的数组,但随后允许实现中止编译或继续它(使用他们认为合适的任何语义)他们的闲暇时光。

标准的作者选择了#3。因此,标准“扩展”认为零大小的数组声明,即使此类构造在标准禁止它们之前得到广泛支持。

C++ 标准允许空对象的存在,但为了让空对象的地址可用作标记,它要求它们的最小大小为 1。对于没有成员的对象因此,大小为 0 将违反标准。但是,如果一个对象包含零大小的成员,则 C++ 标准除了包含此类声明的程序必须触发诊断这一事实之外,对如何处理它没有任何要求。由于大多数使用此类声明的代码都期望生成的对象的大小为零,因此对于接收此类代码的编译器最有用的行为就是以这种方式对待它们。

关于c++ - 这个结构怎么会有 sizeof == 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47352663/

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