#include <iostream>
using namespace std;
class Empty{
char omg[0];
};
int main()
{
Empty em1, em2;
Empty set[100];
cout << sizeof(Empty) << " " << sizeof(em1) << " " << sizeof(em2) << endl;
cout << (long*)&em1 << " " << (long*)&em2 << endl;
cout << "total numbers of element is: " << sizeof(set)/sizeof(*set) << endl;
return 0;
}
その出力は次のとおりです。
0 0 0
0xbff36ad0 0xbff36ac8
要素数: 4
結果はとても驚くべきものです。
上記のように、Empty はクラスであり、そのサイズとそのオブジェクトはすべて 0 です。なぜですか?
たぶん、空のクラスのサイズは 1 であり、クラスが空でない場合、そのサイズはメンバーによって決定されるためだと思いますが、ここではそのメンバーは特別であり、長さゼロの配列であり、この配列のサイズは 0 です。クラスとオブジェクトのサイズはすべて 0 です。
それは私の推測です。プログラムを実行すると、2 つのオブジェクトの両方にアドレスがあり、アドレスが異なることがわかります。
ここで私の質問です: サイズが 0 のオブジェクトを実装できる場合、なぜ C++ 標準は空のオブジェクトが sizeof() = 1 であると述べているのですか? それは「2 つの異なるオブジェクトのアドレスが異なることを保証するため」のためですゼロではない空のクラスの?、しかし今、出力として異なるアドレスがあります。これはどのように起こりますか?
さらに、配列セットのサイズに関係なく、最後の行の出力は常に 4 です。なぜですか?
ありがとう :)
PS: このプログラムは MacOS で実行しています。コンパイラは Apple LLVM バージョン 5.1 (clang-503.0.40) (LLVM 3.4svn ベース) です。