这个班的人数是多少?为什么

What is the size of this class and Why?

本文关键字:多少 为什么      更新时间:2023-10-16

我有两个类,如下

class A
{
};
class B
{
    int a[];
};

int main()
{
    cout << sizeof(A) <<endl;      //outputs 1
    cout << sizeof(B) <<endl;      //outputs 0
    return 0;
}

我很熟悉空类的大小是1,但为什么B类的大小会变成零??

GCC允许将零长度数组作为扩展:http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

和:

作为零长度数组的原始实现的一个怪癖,sizeof的计算结果为零。

就C++语言而言,您的代码格式不正确。特别地,类B不应该在C++标准一致性编译器中编译。您的编译器要么有错误,要么将此功能作为扩展提供。

带有-pedantic-errors -std=c++11的GCC给出以下错误:

cpp.cpp:18:11: error: ISO C++ forbids zero-size array 'a' [-Wpedantic]
     int a[];
           ^

空类的大小不是1。在C++系统中,它至少是1。原因是,例如,您需要能够分配一个具有new的实例,并有一个指向它的非空指针

相反,第二种情况只是无效的C++。

编译器制造商通常会通过默认情况下允许非标准的"扩展"来获得一些自由,并试图让你无意识地使用它们(偏执狂会说,通过让你的代码无法被其他编译器移植来锁定你)。