为什么对象的大小为零

Why the size of the object is zero

本文关键字:小为 对象 为什么      更新时间:2023-10-16

我得到对象的大小为零,这是不应该的。请解释一下为什么编译器给出这个答案的概念?

  #include<iostream>
  using namespace std;
  class xxx{
      public: int a[];  // Why this line is not giving error.
  }; 
  int main(int argc, char *argv[])
  {
      xxx x1;
      cout<<sizeof(x1); //Q=Why this code is not giving error.
      return 0;
  }

正如其他人所说,C++中的对象永远不能有 0 的大小。

但是,由于代码首先C++无效(数组不能为空),因此这无关紧要。编译器只是做它想做的事。

带有-pedantic的 GCC 拒绝此代码。MSVC 至少警告说。我的clang++版本包含-pedantic ICE,但在此之前确实会发出警告。

您没有使用符合标准的编译器。对象大小不能0,即使是空的classstruct也有大小1。此外,必须指定数组维度。

编辑:这很奇怪,ideone也打印出0。在 MSVS 中,我收到警告,但至少大小为 1。

5.3.3. 大小

  1. [...]当应用于类时,结果是该类的对象中的字节数 [...]最派生类的大小应 大于零。[...]将 sizeof 应用于基类子对象的结果是基类类型的大小。[...]

编辑2:

我在 MSVS 中尝试了以下内容:

xxx a[100];

并且无法编译。奇怪的是它如何没有事先发现错误。

xxxa的元素称为灵活数组成员。

灵活的阵列成员不在C++标准中。它们是C99的一部分。但是,许多编译器供应商提供灵活的数组成员作为C++扩展。

您的代码按原样不是合法的 C 代码。它使用C++特定的构造。你的代码很容易改成C.改class struct,去掉public,把C++I/O的使用改成C的printf。通过这些更改,转换后的代码仍然是非法的 C99 代码。灵活数组成员仅允许作为结构的最后一个元素,否则该元素为非空。

显然,您的供应商将灵活阵列成员概念带到了C++,但没有将结构非空的约束。

对象的大小不能为零。 即使类为空,其大小也永远不会为零。

查看链接以了解更多Bjarne Stroustrup的C++风格和技术常见问题解答。