English 中文(简体)
具有虚拟功能的从基类继承的等级
原标题:sizeof on a class inheriting from a base class with a virtual function
  • 时间:2009-09-01 19:07:14
  •  标签:

下面的编码碎片。

/*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的物体),那么在所有其他情况下,物体的规模似乎都由逐个边界决定。

原因何在? 我自此问,我是猜测。

最佳回答
问题回答

我不敢确定问题是什么,但我是一小gues,认为你对以下事实重新感到困惑:<代码>sizeof (A)=1X。 来源于<条码>A, 加上<条码><>>>> 外地,<条码>sizeof(X)==1。 (尽管您期望在<代码>X上填写2-1>,但<代码>><>>>>>>/代码>上填写1

这称为“豁免基类优化”。 在C/C++中,物体必须具有非零尺寸(ISO C++ 1.8 [intro.object]/5)——这间接意味着每个物体都有独特的地址,尽管工会如此,即便是一个空的阶层,它仍至少必须是一顿。 然而,当物体为另一个物体的底下级时,该限制即解除。 因此,<代码>的例子 必须至少按字母顺序排列,但以<代码>为准。 A是另一类的基类,没有要求再做任何事,汇编者可以完全摆脱这一 du;因此,<代码>的大小。 X仅来自char领域。





相关问题
热门标签