可能性のある重複:
C++の空のクラス
Cの空の構造体のサイズは?
C++で空の構造体のサイズが1であるとどこかで読んだので、それを確認することを考えました。残念ながら、私はそれをCファイルとして保存し、<stdio.h>
ヘッダーと出力を見て驚いた。 0でした。
つまり
struct Empty {
};
int main(void)
{
printf("%d",(int)sizeof(Empty));
}
cファイルとしてコンパイルした場合は0、C++ファイルとしてコンパイルした場合は1を出力していました。その理由を知りたい。サイズが0の場合、クラスの2つのオブジェクトが同じアドレスを持っているため、c ++のsizeof空の構造体はゼロではないことを読みました。これは不可能です。どこが間違っているのですか?
Cで空の構造を持つことはできません。これは構文制約違反です。ただし、gccはCで空の構造を許可します 拡張として 。さらに、構造に名前付きメンバーがない場合の動作はundefinedです。
C99
さんのコメント:
Struct-declaration-listに名前付きメンバーが含まれていない場合、動作は未定義です。
そう
struct Empty {}; //constraint violation
struct Empty {int :0 ;}; //no named member, the behaviour is undefined.
そして、はい、空の構造体のサイズはC++です ゼロにはできません :)
いくつかの理由があります。特に、これは、その構造体へのポインターに対するポインター演算が無限ループにつながることがないようにするためです。詳しくは:
http://bytes.com/topic/c/insights/660463-sizeof-empty-class-structure-1-a
これがなぜ起こるのか、そしてより適切にはそれを回避する(安全な)方法を説明する素晴らしい記事があります:)