9

次の2つのクラスがあります

class A
{

};

class B
{
    int a[];
};


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

空のクラスのサイズが 1 であることはよく知られていますが、クラス B のサイズが 0 になるのはなぜですか??

4

3 に答える 3

6

GCC では、拡張子として長さゼロの配列を許可しています: http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

と:

長さゼロの配列の元の実装の癖として、sizeof はゼロに評価されます。

于 2013-06-27T05:40:56.957 に答える
4

C++ 言語に関する限り、コードの形式が正しくありません。特に、クラスBは C++ 標準準拠コンパイラでコンパイルすべきではありません。コンパイラにバグがあるか、この機能を拡張機能として提供しています。

GCCで次の-pedantic-errors -std=c++11エラーが発生します:

cpp.cpp:18:11: error: ISO C++ forbids zero-size array 'a' [-Wpedantic]
     int a[];
           ^
于 2013-06-27T05:34:03.803 に答える
2

空のクラスのサイズは 1 ではありません。C++ システムでは少なくとも1 です。newその理由は、たとえば、インスタンスを割り当てて、それに向けられたnull以外のポインターを持つことができる必要があるためです。

2 番目のケースは、単純に無効な C++ です。

多くの場合、コンパイラの作成者は、非標準の「拡張機能」をデフォルトで許可することである程度の自由を取り、無意識のうちにそれらを使用しようとします (偏執狂は、コードを他のコンパイラに移植できないようにすることでロックインすると言うでしょう)。

于 2013-06-27T05:43:06.920 に答える