为什么物体的大小为零

问题描述 投票:0回答:4

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

  #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++ sizeof
4个回答
4
投票

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

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

GCC 与

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


2
投票

您没有使用符合标准的编译器。对象大小不能是

0
,即使是空的
class
struct
也有大小
1
。此外,必须指定数组维度。

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

5.3.3。尺寸

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

编辑2:

我在 MSVS 中尝试了以下操作:

xxx a[100];

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


2
投票

您的类

a
中的元素
xxx
称为灵活数组成员。

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

您的代码原样不是合法的 C 代码。它使用 C++ 特定的构造。您的代码很容易更改为 C。将

class
更改为
struct
,去掉
public
,并将 C++ I/O 的使用更改为 C 的
printf
。经过这些更改,您转换后的代码仍然是非法的 C99 代码。灵活数组成员仅允许作为结构的最后一个元素,否则该结构为非空。

显然你的供应商将灵活的数组成员概念转移到了 C++ 中,但没有限制结构必须为非空。


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.