重複の可能性:
C++: 空のクラスのオブジェクトのサイズは?
次のようなデータのないクラスがあります
class A {};
オブジェクトを定義するために使用します
A a;
オブジェクト「a」にはアドレスがあると思いますよね?それはいくつかのメモリを占有しますか?もしそうなら、それは何バイトを占めていますか?
オブジェクト「a」が void 型の場合はどうなりますか。どうもありがとう!
重複の可能性:
C++: 空のクラスのオブジェクトのサイズは?
次のようなデータのないクラスがあります
class A {};
オブジェクトを定義するために使用します
A a;
オブジェクト「a」にはアドレスがあると思いますよね?それはいくつかのメモリを占有しますか?もしそうなら、それは何バイトを占めていますか?
オブジェクト「a」が void 型の場合はどうなりますか。どうもありがとう!
オブジェクト「a」にはアドレスがあると思いますよね?それはいくつかのメモリを占有しますか?もしそうなら、それは何バイトを占めていますか?
IIRC 標準では、すべてのオブジェクトにアドレスがあり、オブジェクトの最小サイズ ( によって返されるsizeof
) は 1 であることが義務付けられています。そうは言っても、おそらくオプティマイザーはその変数を非表示にします (明示的にそのアドレスを要求しない限り)。
それがビットフィールド (9.6) でない限り、最も派生したオブジェクトはゼロ以外のサイズを持ち、1 バイト以上のストレージを占有するものとします。基本クラスのサブオブジェクトは、サイズがゼロの場合があります。[...]
オブジェクトがビットフィールドまたはサイズがゼロの基本クラスのサブオブジェクトでない限り、そのオブジェクトのアドレスは、それが占有する最初のバイトのアドレスです。サイズがゼロのビットフィールドでも基本クラスのサブオブジェクトでもない 2 つの別個のオブジェクトは、別個のアドレスを持つ必要があります。4
注 4: 「as-if」ルールの下では、プログラムが違いを観察できない場合、実装は 2 つのオブジェクトを同じマシン アドレスに格納するか、オブジェクトをまったく格納しないことが許可されます (1.9)。
(C++11 §1.8 ¶5-6)
オブジェクト「a」が void 型の場合はどうなりますか。
void
「不完全型」であるため、変数の宣言には使用できません。
型に値の
void
空のセットがあります。タイプは、void
完了できない不完全なタイプです。
(C++11 §3.9.1 ¶9)
理論的には、メモリを消費する必要はまったくありません。まとめて最適化できます。
ただし、それが意味するものである場合、sizeof
クラスはできません。0
を出力するsizeof(a)
と、(ほとんどの場合) が得られます1
(それが何であれ、ゼロ以外の値です)。
また、 type のオブジェクトを持つことはできないvoid
ため、最後の質問は意味がありません。