2010-11-23 13 views
5

(空のクラスsizof私の実装には1ですか)?はいの場合はなぜですか? nest_emptyを空のクラスとみなすことはできますか?ネストされた空のクラス

EDIT:

class nest_empty 
{ 
    class empty{}; 
    empty d; 
}; 

nest_emptyの大きさは、まだ1でしょうか?はいの場合はなぜですか?

+0

私は100%確かではありませんが、ネストされたクラスは通常のクラスのように静的であると確信しています。ですから、nest_emptyクラスは、空のインスタンスを与えない限り、まだサイズ1になります。私は答えが何であるか知りたい。 – Crisfole

+0

@equilibrium:何が変更されたのかを正しく特定せずに答えを出した後の質問を変更するのは非常に混乱します。私は** EDIT **の区切り記号を追加しました。 –

答えて

6

nest_emptyのあなたの最初のバージョンは、空のクラス(無非静的データメンバ、および無空でない塩基)である、彼らはあなたの実装でサイズ1を持っているので、もし、それがサイズ1

「なぜを持っていますなぜなら空のクラスはサイズが0で(標準では禁止されている)、実装者が1を選択しているからです。

2番目のnest_emptyは空のクラスではありません(非静的なデータメンバーを持っています)。それは合法的に私はそれが実際に持っているかどうかを伝えることはできません、その唯一の非静的データメンバいるので、サイズ1を持っているd、タイプemptyであり、空のクラスであるので、おそらくサイズの1

ができあなたの実装では、サイズ1。コンパイラに尋ねてください。

3

はい。 emptyは、名前空間のちょうどnest_emptyにあります。

class nest_empty{};は、単にnest_emptyと定義しています。 emptyにはどのメンバーも宣言していません。

+0

編集内容を参照してください。 –

+0

サイズは実装が感じることに基づいて0以外の値になります。期間。 – Chubsdad

+0

の場合、2番目の 'nest_empty'は空のクラスではありません(メンバーには空のクラスの型があってもメンバーがあります)。もちろん、 'nest_empty'のサイズは内容の大きさに加えて' empty'とpaddingの大きさになります。これは他のポスターによって指摘されるようにいくつかの正の値になります。 – lijie

3

sizeof(nest_empty)は必須ではありませんが、ゼロにはなりません。

$ 9.3言う:あなたがnest_emptyの配列を作成する場合は、それぞれが異なるアドレスを持つ必要があるためComplete objects and member subobjects of class type shall have nonzero size.

はこれが必要とされています。

EDIT

おそらく、sizeof(nest_empty)は、両方のバージョンで同じ結果を得られますが、それが義務付けられていないこと。標準で言う唯一のことは、空のクラスが非ゼロサイズを持つことです。

+0

編集を参照してください。 –

+0

@equilibrium:(標準で)実装は 'sizeof(nest_empty)== sizeof(空)'を持つことが許されます。ほとんどのコンパイラでは、両方とも '1'にな​​ります。 –

関連する問題