1

これら2つのクラスのクラスサイズについて混乱しています。

これの出力が「SIZEOF(X)= 4; SIZEOF(Y)= 8;

または、この質問に関するいくつかの有用なリンク/リソースを提供しますか?

誰かが私を助けることができますか?

#include <iostream>
using namespace std;

class X {
    int i;
public:
    X() { i = 0; }
    void set(int ii) { i = ii; }
    int read() const { return i; }
    int permute() { return i = i * 47; }
};


class Y : public X {
    int i; // Different from X's i
public:
    Y() { i = 0; }
    int change() {
        i = permute(); // Different name call
        return i;
    }
    void set(int ii) {
        i = ii;
        X::set(ii); // Same-name function call
    }
};

int main() {
    cout << "sizeof(X) = " << sizeof(X) << endl;
    cout << "sizeof(Y) = "
        << sizeof(Y) << endl;
    Y D;
    D.change();
    // X function interface comes through:
    D.read();
    D.permute();
    // Redefined functions hide base versions:
    D.set(12);
    getchar();
} ///:~
4

6 に答える 6

3

X には、4 バイトの1 つの intが含まれます。

Y には、X のメンバ変数、つまり合計 8 バイトも保持されるため、それぞれ 4 バイトの 2 つの intが含まれます。

于 2012-05-14T07:17:05.630 に答える
1

質問のタイトルは、メンバー関数と基本クラスのために、これらのクラスのサイズが大きいと考えていることを示唆していると思います。まあ、これは間違っています。

最終的にコンパイルされたコードでは、メンバー関数はフリー関数と何ら変わりはなく、暗黙の最初のパラメーターがthisであるため、オブジェクトごとのスペースを使用せず、型のサイズにカウントされません。

さらに、単なる基本クラスは、追加のメモリ使用量を課すことはありません。それら (それらのメンバー) は、派生クラスのメンバーと一緒に格納されるだけです。にを隠していますがX、まだそこにあり (明示的な指定 ( ) でアクセスできます)、 に加えてスペースを取るため、それぞれ 4 バイトの が2つ与えられます。iYX::iYiint

仮想メンバー関数がある場合、状況は少し異なります。この場合、追加のインダイレクション (仮想関数アドレスのリストへのポインターであり、4/8 バイトである可能性が最も高い) のために、わずかなメモリ オーバーヘッドが発生します。

于 2012-05-14T07:21:43.360 に答える
0

X には 1 つの整数が含まれ、Y には 2 が含まれるため (そのうちの 1 つが継承されます)。マシン上の整数のサイズは 4 バイトです。

于 2012-05-14T07:18:51.087 に答える
0

staticクラス内のコードは 1 か所にしか存在しません (データ メンバーと同じ)。クラスインスタンスごとに複製されません。したがって、クラスのサイズにはカウントされません。

于 2012-05-14T07:19:01.580 に答える
0

sizeof(X)のインスタンスのサイズを返しますX。お使いのシステムでは、int のサイズは 4 です。次に、クラスを Y とそのデータで拡張します。このクラスはポリモーフィックではなく、追加のスペース (vtables など) やパディング (自然な配置を調整するため) を必要としません。

于 2012-05-14T07:19:02.237 に答える