ホームページ >バックエンド開発 >C++ >C の空のクラスのサイズが 0 バイトではなく 1 バイトであるのはなぜですか?

C の空のクラスのサイズが 0 バイトではなく 1 バイトであるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-14 19:12:12167ブラウズ

Why Do Empty Classes in C   Have a Size of 1 Byte, Not 0 Bytes?

空のクラス オブジェクトのサイズを理解する

C では、空に見えるクラスでもサイズが 0 以外になります。 0 バイトであると考える人もいるかもしれませんが、そうではありません。この質問では、この動作の背後にある理由を詳しく調べます。

これを説明するには、次のプログラムを考えてみましょう。

#include <iostream>
using namespace std;

class Empty {};

int main()
{
    Empty e;
    cerr << sizeof(e) << endl;
    return 0;
}

このプログラムをコンパイルすると、さまざまなコンパイラ (Visual C など) での出力がCygwin-g ) は一貫して 1 バイトです。オブジェクトにはデータ メンバーが含まれていないため、これは予期しないように思えるかもしれません。

なぜ 1 バイトなのか?

コンパイラは、空のクラス オブジェクトに 1 バイトのサイズを割り当てて、次のことを保証します。異なるオブジェクトには一意のアドレスがあります。この区別は、メモリを適切に管理し、エイリアシングの問題を回避するために重要です。

なぜ 4 バイト (マシン語) ではないのですか?

オブジェクトのサイズが揃えられることが期待されるかもしれません。マシンワードサイズ (32 ビットまたは 64 ビット) を使用しますが、これは当てはまりません。空のクラスでは、整列するデータ メンバーが存在しないため、整列の問題は無関係になります。その結果、コンパイラは、実行可能な最小サイズ 1 バイトを割り当てることによって領域を最適化します。

非ゼロ サイズの調整

サイズ 0 バイトは、次の 2 つのオブジェクトが存在することを意味します。空のクラスが同じメモリ位置を占有する可能性があり、それらを区別できなくなります。このあいまいさにより、プログラムで未定義の動作が発生する可能性があります。したがって、ゼロ以外のサイズ (この場合は 1 バイト) により、一意のアドレスが保証され、プログラムの整合性が維持されます。

以上がC の空のクラスのサイズが 0 バイトではなく 1 バイトであるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。