重複の可能性:
C ++:空のクラスのオブジェクトのサイズはどれくらいですか?
次の出力はなぜ1
ですか?
#include <iostream>
class Test
{
};
int main()
{
std::cout << sizeof(Test);
return 0;
}
重複の可能性:
C ++:空のクラスのオブジェクトのサイズはどれくらいですか?
次の出力はなぜ1
ですか?
#include <iostream>
class Test
{
};
int main()
{
std::cout << sizeof(Test);
return 0;
}
この標準では、サイズ0のオブジェクト(およびそのクラス)は許可されていません。これにより、2つの異なるオブジェクトが同じメモリアドレスを持つことが可能になるためです。そのため、空のクラスでも(少なくとも)1のサイズにする必要があります。
2つの異なるオブジェクトのアドレスが異なることを確認します。同じ理由で、「new」は常に個別のオブジェクトへのポインタを返します。
完全な答えについては、 Stroustrupを参照してください。
C ++標準では、クラスのサイズが少なくとも1つであることが保証されています。C ++標準では、どのオブジェクトも別のオブジェクトと同じメモリアドレスを持つことはできないと規定されています。これにはいくつかの理由があります。
new
常に別のメモリアドレスへのポインタを返すことを保証するため。
一部のゼロ除算を回避するため。たとえば、ポインタ演算(その多くはコンパイラによって自動的に実行されます)には、で除算することが含まれsizeof(T)
ます。
ただし、空の基本クラスが派生クラスのサイズに1を追加するという意味ではないことに注意してください。
struct Empty { };
struct Optimized : public Empty {
char c;
};
// sizeof(Optimized) == 1 with g++ 4.0.1
データメンバーとメンバー関数のないクラスこのようなタイプのクラスは、空のクラスと呼ばれます。空のクラスのオブジェクトのサイズは常に1バイトです。
その時点で任意のクラスのオブジェクトを作成すると、オブジェクトは常に3つの特性を取得します。
その時に空のクラスのオブジェクトを作成すると、そのオブジェクトの状態は何もありません。そのオブジェクトの動作も何もありませんが、コンパイラはそのオブジェクトに一意のアドレスを割り当てます。コンピュータのメモリは常にバイト形式で編成されており、オブジェクトアドレスの場所で使用可能な最小メモリは1バイトです。そのため、空のクラスのオブジェクトのサイズは1バイトです。
MauritsとPéterが言ったこと。
このコンテキストで、コンパイラーは空の基本クラス最適化(EBCO)を実行できることに注意してください。
#include <iostream>
struct Foo {};
struct Bar : Foo {};
int main () {
std::cout << sizeof(Foo) << ',' << sizeof(Bar) << std::endl;
}
コンパイルして実行すると、おそらく「1,1」が出力されます。EBCOのVandevoorde/Josuttis16.2も参照してください。