代码之家  ›  专栏  ›  技术社区  ›  anon

c++对象大小

c++
  •  10
  • anon  · 技术社区  · 16 年前

    struct Foo: public Bar {
     ....
    }
    

    Foo没有引入新的成员变量。Foo只引入了一组成员函数&静态函数。C++标准的任何部分现在都保证了:

    sizeof(Foo) == sizeof(Bar)
    

    ?

    3 回复  |  直到 16 年前
        1
  •  11
  •   Igor Zevaka    16 年前

    我至少能想到一个场景 sizeof(Foo) != sizeof(Bar)

    class Bar {
    public:
     int m_member;
    };
    
    class Foo : Bar {
        virtual ~Foo();
    };
    

    Foo Bar

    sizeof(Foo) - 8
    sizeof(Bar) - 4
    

    编辑 这对结构和类都适用,我重新运行测试以确认这一点。

        2
  •  5
  •   Chris Dodd    16 年前

    是的-如果他们是豆荚类型。如果POD类型具有相同顺序的布局兼容成员,则它们被保证是布局兼容的(也就是说,您可以从一个memcpy到另一个memcpy)。由于子类自动将其基类的所有成员按相同的顺序排列,在本例中没有其他成员,因此它们将与布局兼容,因此大小相同。见规范第9.3节。

    注意,为了成为POD类型,它们必须没有虚拟功能(以及其他要求)

    编辑

    最新的标准草案将吊舱类型的要求分为两组: 课程和 标准布局 豆荚 类是那些两者都是 琐碎的 我相信为了你想要的担保,只是 标准布局 琐碎的 (因此 )班级。要求 标准布局 规范中包括:

    A 标准布局 类是指:

    没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,

    没有虚函数(10.3)和虚基类(10.1),

    没有与第一个非静态数据成员相同类型的基类。108

        3
  •  2
  •   Adam Maras    16 年前

    virtual . 虽然C++标准不能保证这一点,但是拥有虚拟函数几乎可以肯定改变对象的大小(因为V表)。