一个类或对象的"sizeof"可以为零吗?

Div*_*vya 20 c++ class object

我们都知道空类的大小或空类的对象将是1个字节.我遇到了sizeof一个类及其对象变为0的东西.该程序在语法上是正确的,因为没有编译或运行时错误.这是未定义的行为吗?我试图执行的用例有意义,看起来像一个有效的用例?不给类中的数组提供精确的下标或大小是一个很大的错误吗?代码段如下:

#include<iostream>
using namespace std;
class A
{
   char a[];
};
int main()
{
    A b;
    cout<<sizeof(A)<<endl;
    cout<<sizeof(b)<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

0

0

sizeof一个空类是一个字节(非零基本)和其中的原因是说,像"为了确保不同的对象有不同的地址."

在这种情况下会发生什么sizeof呢?当班级来零时?注意:也观察到相同的行为int a[].

Kir*_*rov 25

它被称为"灵活的阵列成员",它是C99的一个特征(我认为).它不是有效的C++ - 你没有警告/错误,可能是因为编译器支持它作为扩展.

使用-Wall -Wextra -pedantic -std=c++NN(98,03,11,14,..)进行编译应生成警告(最后两个标志将禁用任何编译器扩展).


您可以在此相关问题中看到一些信息:在C练习中使用灵活的数组成员吗?

例如,以下是GCC对此的说法:

在ISO C99中,您将使用灵活的数组成员,其语法和语义略有不同:
...
灵活的数组成员具有不完整的类型,因此可能不应用sizeof运算符.作为零长度数组的原始实现的怪癖,sizeof的计算结果为零.

(来源:https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html).

这解释了类的0大小char a[]而不是0,但正如我已经提到的 - 它是一个C特性,而不是一个有效的C++.


Moh*_*ain 6

如果你用-pedanticflag 编译

$ g ++ -W -Wall -pedantic prog.cpp
prog.cpp:5:11:警告:ISO C++禁止零大小数组'a'[-pedantic]

C++不支持VLA,因此您的类声明不合法,超出了标准C++规则的范围.