Class sizes with virtual inheritance in C++

前端 未结 5 1882
[愿得一人]
[愿得一人] 2021-01-02 20:48
#include

using namespace std;

class abc
{
    int a;
};
class xyz : public virtual abc
{
    int b;
};

int main()
{
    abc obj;
    xyz obj1;
            


        
5条回答
  •  攒了一身酷
    2021-01-02 21:18

    Virtual bases classes increase (dynamic, runtime) conversion requirements, and I suppose that the size increase are for a kind of 'pivoting ground' to walk the (base) class hierarchy in non-ambiguous ways when doing such conversions.

    In less mumbo jumbo, here is a counter example that could show what's going on:

    • Using virtual abc http://ideone.com/h5y7R
      • sizeof(xyz) == 44 (88 on 64bit arch)
    • Using nonvirtual abc http://ideone.com/h5y7R
      • sizeof(xyz) == 68 (128 (padded) on 64bit arch)

     

    #include
    
    class abc
    {
        int x;
        virtual void t();
    };
    
    template  struct interm : virtual abc 
    {
        virtual void t();
        virtual void s();
    };
    
    struct xyz : 
        /*virtual*/ interm<1>, 
        /*virtual*/ interm<2>, 
        /*virtual*/ interm<3>, 
        /*virtual*/ interm<4>,
        /*virtual*/ interm<5>, 
        /*virtual*/ interm<6>, 
        /*virtual*/ interm<7>, 
        /*virtual*/ interm<8>
    {
        int b;
        virtual void t();
        virtual void s();
    };
    
    
    int main()
    {
        std::cout << sizeof(abc)       << std::endl;
        std::cout << sizeof(interm<1>) << std::endl;
        std::cout << sizeof(xyz)       << std::endl;
        return 0;
    }
    

    You'll notice a significant reduction in size when marking the abc base as virtual (at least on gcc). Also, note no effect when marking (any) of the intermediate base classes as (non)virtual.

提交回复
热议问题