为什么对象的大小为零

时间:2012-04-27 09:59:54

标签: c++ compiler-construction size

我将对象的sizeof设为零,这是不应该的。请解释为什么编译器给出这个答案的概念?

  #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;
  }

4 个答案:

答案 0 :(得分:4)

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

但是,由于代码首先是无效的C ++(数组不能为空),这是无关紧要的。编译器只是按照自己的意愿行事。

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

答案 1 :(得分:2)

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

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

5.3.3。的sizeof

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

编辑2:

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

xxx a[100];

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

答案 2 :(得分:2)

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

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

您的代码不是合法的C代码。它使用C ++特定的结构。您的代码很容易更改为C.将class更改为struct,删除public,并将C ++ I / O的使用更改为C printf。有了这些更改,您转换的代码仍然是非法的C99代码。灵活的数组成员只允许作为非空的结构的最后一个元素。

显然,您的供应商将灵活的数组成员概念转移到C ++,但不是结构非空的约束。

答案 3 :(得分:1)

对象的大小不能为零。即使班级为空,其大小也不会为零。

查看链接以了解更多Bjarne Stroustrup's C++ Style and Technique FAQ