3

次のコードフラグメントの場合。

/*This program demonstartes how a virtual table pointer 
 * adds to a size of a class*/

class A{

};

class X{
    public:
        void doNothing(){}
    private:
        char a;

};

class Z:public X {

    public:
        void doNothing(){}
    private:
        char z;

}; 

class Y{
    public:
        virtual void doNothing(){}
    private:
        char a;

};

class P:public Y {

    public:
        void doNothing(){}
    private:
        char pp[4];

};

int main(){
    A a;
    X x;
    Y y;
    Z z;
    P p;
    std::cout << "Size of A:" << sizeof(a) << std::endl;// Prints out 1
    std::cout << "Size of X:" << sizeof(x) << std::endl;//Prints out 1
    std::cout << "Size of Y:" << sizeof(y) << std::endl;//Prints 8
    std::cout << "Size of Z:" << sizeof(z) << std::endl;
//Prints 8 or 12 depending upon wether 4 bytes worth of storrage is used by Z data member.
    std::cout << "Size of P:" << sizeof(p) << std::endl;
    std::cout << "Size of int:" << sizeof(int) << std::endl;
    std::cout << "Size of int*:" << sizeof(int*) << std::endl;
    std::cout << "Size of long*:" << sizeof(long*) << std::endl;
    std::cout << "Size of long:" << sizeof(long) << std::endl;
    return 0;

}

私が気付いたように見える動作は、空のクラスがインスタンス化されるか、空のクラスがバイト境界から継承されるときはいつでも考慮されない(つまり、サイズ1バイトのオブジェクトが許可される)場合、他のすべての場合、オブジェクトサイズは次のように決定されるようです。バイト境界。

これの理由は何ですか?この時点で私は推測しているので、私は尋ねます。

4

2 に答える 2

6

質問が何であるかはわかりませんが、私は大げさな推測をして、フィールドを追加することsizeof(A)==1からX派生しているという事実に混乱していると仮定しますが、それでも(2であると予想しますが- 1つは、1つはin )。Acharsizeof(X)==1AcharX

これは「空の基本クラスの最適化」として知られています。C / C ++では、オブジェクトのサイズはゼロ以外である必要があります(ISO C ++ 1.8 [intro.object] / 5)-これは、結合に関係なく、すべてのオブジェクトが個別のアドレスを持っていることを間接的に意味します-したがって、空のクラスの場合でも、少なくとも1バイトである必要があります。ただし、オブジェクトが別のオブジェクトの基本クラスサブオブジェクトである場合、この制限は解除されます。したがって、のインスタンスはAそれ自体で少なくとも1バイトである必要がありますが、がA別のクラスの基本クラスである場合、その必要はなくなり、コンパイラはそのダミーのパディングを完全に取り除くことができます。したがって、のサイズはXそのcharフィールドからのみ取得されます。

于 2009-09-01T19:19:33.770 に答える
3

これは、空のクラスのサイズをゼロにできない理由についてのStroustrupの説明です。アラインメントの境界に準拠するものとは対照的に、なぜそれが1バイトであるかについては、これはコンパイラーに依存すると思います。

于 2009-09-01T19:19:44.113 に答える