假设我有:
struct Foo: public Bar {
....
}Foo没有引入新的成员变量。Foo只引入了一组成员函数&静态函数。现在C++标准中是否有任何部分可以保证:
sizeof(Foo) == sizeof(Bar)谢谢!
发布于 2010-05-07 09:00:22
我至少能想到一种场景,sizeof(Foo) != sizeof(Bar)
class Bar {
public:
int m_member;
};
class Foo : Bar {
virtual ~Foo();
};Foo将有一个vtable指针,而Bar没有,前者的大小将比Bar大一个字。在32位调试MSVC2010上:
sizeof(Foo) - 8
sizeof(Bar) - 4编辑这对于结构和类都是正确的,我重新运行测试来确认这一点。
发布于 2010-05-07 09:28:46
是-如果它们是POD类型。POD类型必须是布局兼容的(也就是说,你可以从一个到另一个),如果它们有布局兼容的成员在相同的顺序。因为一个子类自动地让它的基类的所有成员以相同的顺序排列,在这种情况下,没有其他成员,所以它们将是布局兼容的,因此大小相同。请参阅规范的第9.3节。
请注意,为了成为POD类型,它们必须没有虚拟函数(以及其他要求)
编辑
最新的草案标准将POD类型的需求分为两组:琐碎类和标准布局类。POD类是那些既是琐碎的又是标准布局的类,我相信对于你想要的guarentee的大小来说,仅仅是标准的布局就足够了--它们不需要也是琐碎的(因此POD)类。规范对标准布局的要求是:
标准布局类是符合以下条件的类:
-没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
-没有虚拟函数(10.3)和虚拟基类(10.1),
-对所有非静态数据成员具有相同的访问控制(第11条),
-没有非标准布局基类,
-或者在大多数派生类中没有非静态数据成员,并且最多有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类,并且
-没有与第一个非静态数据成员具有相同类型的基类。108
发布于 2010-05-07 08:58:28
当然不是,特别是当你的两个类中的任何一个函数都是virtual的时候。虽然C++标准不能保证这一点,但拥有虚拟函数几乎肯定会改变对象的大小(因为v-table)。
https://stackoverflow.com/questions/2785497
复制相似问题