-2

私はこの小さなプログラムを書きました:

#include <iostream>

using namespace std;

class a{
};

int main ()
{
a *obj=new a();
cout<<sizeof(obj)<<endl;
cout<<sizeof(*obj)<<endl;
delete obj;
}

以下は私が得た出力です:

> ./a.out
4
1
>

オブジェクトのアドレスを格納するために4バイトを使用していることを理解できます。しかし、私が理解していないのはその1バイトです。空のクラスなので、その1バイト(オブジェクトのサイズ)の目的が何であるか疑問があります。

2 番目の質問は、既定のコンストラクターが呼び出されるかどうかです。はいの場合、それは基本的に何をしますか?

4

4 に答える 4

1

0オブジェクトのサイズをC++ にすることはできないため、バイトが存在します。ダミーバイトです。の配列について考えてみましょうa- のサイズが の場合a0すべてのオブジェクトが同じアドレスに配置されます。

理論的には、空のデフォルト コンストラクタが呼び出されます。実際には、観察可能な動作がないため、最適化されています。

于 2013-02-25T12:44:52.647 に答える
0

最初sizeofに、32 ビット システムのポインター 32 ビットのサイズを出力します。異なるオブジェクトは異なるアドレスで作成する必要があるため、2 番目は 1 バイトにアラインされたコンテンツsizeofのサイズを出力します。a

ただし、非仮想メソッドでもゼロサイズのクラスを持つことができます:

class A
{
    A()
    {
       cout << "Hi" << endl;
    }
    char unused[];
    // Note: Putting at least a virtual method increases the size to 4 bytes.
};

cout << sizeof(A) << endl; // Prints out 0

さらに、このコードは、すべてのAオブジェクトが同じメモリ アドレスにあることを示しています。

A a1;
A a2;

cout << &a1 << endl;
cout << &a2 << endl;

出力:

0x22ff00

0x22ff00

于 2013-02-25T12:45:17.990 に答える
0

各オブジェクトには個別のアドレスが必要であるため、C++ のオブジェクトの最小サイズは 1 です。

デフォルトのコンストラクターは何もしません。

于 2013-02-25T12:45:50.647 に答える
0

その1バイトの目的は何ですか(オブジェクトのサイズ)

C++ では、すべての個別のオブジェクトに個別のアドレスが必要です。これを実現するために、すべてのオブジェクトは、少なくともアドレス指定可能な最小単位、つまり 1 バイトと同じ大きさです。

2 番目の質問は、既定のコンストラクターが呼び出されるかどうかです。

技術的には、はい。独自のデフォルト コンストラクターを宣言しない場合、必要に応じて暗黙的に生成されます。暗黙のコンストラクターは、すべてのメンバーと基本サブオブジェクトをデフォルトで構築します。でも...

はいの場合、それは基本的に何をしますか?

クラスには初期化が必要なメンバーまたはサブオブジェクトがないため、暗黙のコンストラクターは自明です。つまり、何もしません。

于 2013-02-25T12:56:47.990 に答える