首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++对象大小

c++对象大小
EN

Stack Overflow用户
提问于 2010-05-07 08:50:32
回答 3查看 247关注 0票数 10

假设我有:

代码语言:javascript
复制
struct Foo: public Bar {
 ....
}

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

代码语言:javascript
复制
sizeof(Foo) == sizeof(Bar)

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-07 09:00:22

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

代码语言:javascript
复制
class Bar {
public:
 int m_member;
};

class Foo : Bar {
    virtual ~Foo();
};

Foo将有一个vtable指针,而Bar没有,前者的大小将比Bar大一个字。在32位调试MSVC2010上:

代码语言:javascript
复制
sizeof(Foo) - 8
sizeof(Bar) - 4

编辑这对于结构和类都是正确的,我重新运行测试来确认这一点。

票数 11
EN

Stack Overflow用户

发布于 2010-05-07 09:28:46

是-如果它们是POD类型。POD类型必须是布局兼容的(也就是说,你可以从一个到另一个),如果它们有布局兼容的成员在相同的顺序。因为一个子类自动地让它的基类的所有成员以相同的顺序排列,在这种情况下,没有其他成员,所以它们将是布局兼容的,因此大小相同。请参阅规范的第9.3节。

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

编辑

最新的草案标准将POD类型的需求分为两组:琐碎类和标准布局类。POD类是那些既是琐碎的又是标准布局的类,我相信对于你想要的guarentee的大小来说,仅仅是标准的布局就足够了--它们不需要也是琐碎的(因此POD)类。规范对标准布局的要求是:

标准布局类是符合以下条件的类:

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

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

-对所有非静态数据成员具有相同的访问控制(第11条),

-没有非标准布局基类,

-或者在大多数派生类中没有非静态数据成员,并且最多有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类,并且

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

票数 5
EN

Stack Overflow用户

发布于 2010-05-07 08:58:28

当然不是,特别是当你的两个类中的任何一个函数都是virtual的时候。虽然C++标准不能保证这一点,但拥有虚拟函数几乎肯定会改变对象的大小(因为v-table)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2785497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档