空のクラス オブジェクトのサイズを明らかにする
空のクラスに属するオブジェクトのサイズを決定することは、簡単な調査のように思えるかもしれません。しかし、そこには興味深い複雑さが隠されています。
C では、空のclass は本質的にプレースホルダーであり、データ メンバーやメソッドは含まれません。従来の常識では、そのようなオブジェクトはメモリ空間を占有すべきではないと考えられます。しかし、そうではありません。
パズル: サイズがゼロか非ゼロか?
一見すると、空のクラス オブジェクトが次のことを行うと期待するのが合理的であるように見えます。サイズは 0 バイトです。結局のところ、具体的な情報は含まれていません。ただし、空のクラス オブジェクトへのポインタを参照または割り当てようとすると、そのサイズがゼロ以外でなければならないことがわかります。
暴露実験
単純な空のクラス オブジェクトを作成し、そのサイズを出力するプログラムを実行すると、そのオブジェクトのサイズが確かに 1 バイトであることがわかります。この動作は、Visual C や Cygwin-g を含むさまざまなコンパイラ間で一貫しています。
1 バイトの謎の奇妙なケース
最初の驚きは期待から生じます空のクラス オブジェクトはマシン語と同じサイズ (通常は 32 ビットまたは 64 ビット) を占めることになります。ただし、1 バイト サイズの割り当ては、アライメントを考慮することによって正当化されます。
空のクラス オブジェクトには実際のデータが含まれていないため、そのアライメントは重要ではありません。これにより、基礎となるアーキテクチャが空ではないオブジェクトに対してより大きなアライメントを必要とする場合でも、コンパイラはオブジェクトに 1 バイトを割り当てることができます。
Why Not Zero Bytes?
空のクラス オブジェクトには関連データがありませんが、一意のアドレスを持っている必要があります。この必要性は、個別のオブジェクトには個別のアドレスが必要であるという基本的な規則から生じます。空のクラス オブジェクトのサイズが 0 バイトの場合、複数のオブジェクトが同じアドレスを占有する可能性があり、この原則に違反します。
結論
一見簡単なタスク空のクラス オブジェクトのサイズを決定すると、C 言語に固有の微妙なニュアンスが明らかになります。明示的なデータが含まれていないにもかかわらず、空のクラス オブジェクトには、一意のアドレスを確保し、アライメント制約に準拠するためにゼロ以外のサイズが必要です。
以上が空の C クラス オブジェクトのサイズが 1 バイトなのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。