假设我有:
struct Foo: public Bar {
....
}
Run Code Online (Sandbox Code Playgroud)
Foo没有推出新的会员变速器.Foo只介绍了一堆成员函数和静态函数.C++标准的任何部分现在都保证:
sizeof(Foo) == sizeof(Bar)
Run Code Online (Sandbox Code Playgroud)
?
谢谢!
Igo*_*aka 11
我至少可以想到一个场景sizeof(Foo) != sizeof(Bar):
class Bar {
public:
int m_member;
};
class Foo : Bar {
virtual ~Foo();
};
Run Code Online (Sandbox Code Playgroud)
Foo将有一个vtable指针,而Bar不会和前者的大小将是一个更大的单词Bar.在32位DEBUG MSVC2010上:
sizeof(Foo) - 8
sizeof(Bar) - 4
Run Code Online (Sandbox Code Playgroud)
编辑这适用于结构和类,我重新测试以确认.
是的 - 如果它们是POD类型.如果POD类型具有相同顺序的布局兼容成员,则可以保证POD类型与布局兼容(即,您可以从一个到另一个进行memcpy).由于子类自动使其所有基类的成员具有相同的顺序,并且在这种情况下没有其他成员,因此它们将是布局兼容的,因此大小相同.见规范9.3节.
请注意,为了成为POD类型,它们必须没有虚函数(除其他要求外)
编辑
最新的标准草案将POD类型的要求分为两组:普通类和标准布局类. POD类是那些既简单又标准的布局,我相信你想要的大小只是标准的布局 - 它们也不一定是微不足道的(因而也就是POD)类.规范中标准布局的要求是:
一个标准的布局类是一类:
- 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
- 没有虚函数(10.3),没有虚基类(10.1),
- 对所有非静态数据成员具有相同的访问控制(第11条),
- 没有非标准布局基类,
- 在最派生类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类,并且
- 没有与第一个非静态数据成员相同类型的基类.108
| 归档时间: |
|
| 查看次数: |
243 次 |
| 最近记录: |