sizeof(Foo)
GCC 4.6 でコンパイルすると 0 で1であることに気付きましたsizeof(Bar)
。何らかの理由で、空の構造体に空の配列を追加すると、サイズが 0 になりました。両方の構造体のサイズは同じでなければならないと考えました。ここで何が起こっているのですか?
struct Foo
{
char x[];
};
struct Bar {};
どちらstruct
の宣言も C 標準では許可されていません。n1570 の 6.7.2.1 (8):
struct-declaration-list に名前付きメンバーが直接含まれていない場合、または匿名構造体または匿名共用体を介して含まれていない場合、動作は未定義です。
そして、同じセクションの段落 18:
特殊なケースとして、複数の名前付きメンバーを持つ構造体の最後の要素は、不完全な配列型を持つ場合があります。これは、柔軟な配列メンバーと呼ばれます。ほとんどの場合、柔軟な配列メンバーは無視されます。特に、構造体のサイズは、省略が意味するよりも多くの後続パディングがある場合を除いて、柔軟な配列メンバーが省略されたかのようになります。
(私のものを強調)
柔軟な配列メンバーは C++ では許可されていないため、コードも有効な C++ ではありません。
これは有効なコードではないsizeof
ため、これらに対して によって報告される値は無意味です。
CおよびC++は、ゼロサイズのオブジェクトを許可しません。
gccはそれらを拡張機能としてサポートします。次のような適切なオプションを使用してコンパイルする場合
gcc -std=c99 -pedantic -Wall -Wextra
gccは少なくともそれらについて警告します。g++にも同様のオプションがあります。
空のクラスであっても、 sizeof 演算子は決して 0 を返しません。
さらに、msdn は次のように述べています。
sizeof 演算子は、次のオペランドでは使用できません。