次の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 になるのはなぜですか??
GCC では、拡張子として長さゼロの配列を許可しています: http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
と:
長さゼロの配列の元の実装の癖として、sizeof はゼロに評価されます。
C++ 言語に関する限り、コードの形式が正しくありません。特に、クラスB
は C++ 標準準拠コンパイラでコンパイルすべきではありません。コンパイラにバグがあるか、この機能を拡張機能として提供しています。
GCCで次の-pedantic-errors -std=c++11
エラーが発生します:
cpp.cpp:18:11: error: ISO C++ forbids zero-size array 'a' [-Wpedantic]
int a[];
^
空のクラスのサイズは 1 ではありません。C++ システムでは少なくとも1 です。new
その理由は、たとえば、インスタンスを割り当てて、それに向けられたnull以外のポインターを持つことができる必要があるためです。
2 番目のケースは、単純に無効な C++ です。
多くの場合、コンパイラの作成者は、非標準の「拡張機能」をデフォルトで許可することである程度の自由を取り、無意識のうちにそれらを使用しようとします (偏執狂は、コードを他のコンパイラに移植できないようにすることでロックインすると言うでしょう)。