2011-08-01 8 views
7

はsizeof空のクラス

#include <iostream> 

class A {}; 
class B { char x; }; 

int main() 
{ 
    std::cerr << sizeof(A) << " " << sizeof(B) << std::endl; 
} 

私はそれは空のクラスのサイズを聞いて、共通のインタビューの質問だということを知っている - と私は答えは一つです知っています。

私の質問は空のクラス(空であると思います)の "1"バイトで何が保持されているのですか?コンパイラは内部的に何をしてsizeof Bsizeof Aこの場合?

答えを知るのではなく、完全に理解したいと思います。

+0

これは、コンパイラの実装によって異なります。なぜあなたは気にしますか? –

+8

誰がインタビューでそれを聞いていますか?それはひどいインタビューの質問です。 – nmichaels

+2

ここをクリックしてください:http://stackoverflow.com/questions/621616/c-what-is-the-size-of-an-object-of-an-empty-class – a1ex07

答えて

8

これは本当に意味のある質問ではありません。実行時には1バイトが占有されてマークされ、その位置に他のオブジェクトが割り当てられません。しかし、バイトを占有するためにそこに「保持」されているものはありません。

このルールの唯一の理由は、オブジェクトが一意に識別可能でなければならないということです。オブジェクトは、メモリ内のアドレスによって識別されます。 2つのオブジェクトが同じアドレスを持たないようにする(基本クラスオブジェクトの場合を除く)、空のクラスのオブジェクトはサイズがゼロでないことによってメモリを「占有」します。

+0

IMHO - それは非常に弱い議論です。だから、2つの空のオブジェクトが開始アドレスを共有するのはどうでしょうか?とにかく空のオブジェクトを作成することに意味がないK&R Cの時代は大丈夫だったと思います。 OTOHはC++のものが到着して変更されました。非自明なもので空のオブジェクトを持つことができます。プラスの空のオブジェクトがテンプレートのメタプログラミングで発生する可能性があります – valdo

+4

@valdoこれは誤解です。オブジェクトのユニークな識別は必須*です。 C++のオブジェクトは、それらが占有するメモリによって定義されます(定義によってオブジェクト=メモリの場所)。オブジェクトがアドレスを共有する場合、ランタイムはそれらを区別できません。これは、C++型システムの根底にあるあらゆる種類の前提を壊すでしょう。 1つの具体的な例を挙げると、配列とポインタの算術演算は中断されます。 –

4

空のオブジェクトに1バイトのメモリを使用する必要はありません。純粋に実装に基づいています。

EDIT: 真、それは適合しています(ISO/IEC 14882 P.149):

9クラス[クラス]
..
..
...
3コンプリートオブジェクトとメンバーサブオブジェクトクラスの型がゼロでないものとする...

+2

しかし*オブジェクトはその固有のアドレス(またはタイプ)によって一意に識別可能であるという要件です*。 –

+1

@cprogrammer - それは1バイトである必要はなく、2つの場合もあります:) –

0

あなたは、多くの場合、これらのようなクラスでも同様の効果を見ることができます:

class Foo { 
    int a; 
    char b; 
}; // sizeof(Foo) > sizeof(int) + sizeof(char) 

C++オブジェクト内のすべてのメモリが名前を持っている必要はありません。オブジェクト内の名前のないメモリは、「パディング」と呼ばれます。あなたの空のクラスは1バイトのパディングを持っています。 C++コンパイラがパディングを挿入する最も一般的な理由の1つは、クラスを配列型で使用できるようにすることです。

+0

これは間違いありませんが、空のクラスの場合は、他の答えで説明されているように、異なる効果が働いています。空のクラスは、C++標準で要求されているためサイズがゼロでない必要がありますが、パディングはコンパイラが実装するものです。 –

関連する問題