Ser*_*tch 2 c++ generics size inheritance sizeof
考虑以下继承:
class Base {
protected:
Base() { }
public:
double Multiply(double x);
};
class Derived : public Base {
double _value;
public:
Derived(double init) : _value(init) { }
double Multiply(double x) { return x*_value; }
};
Run Code Online (Sandbox Code Playgroud)
此代码段将用于模板化代码库.多态性不是一种选择,因为它添加了VTable指针,从而使内存消耗增加了一倍.
但是,我怀疑由于C++要求对象的大小至少为1个字节,因此大小Derived
将变为9个字节,因此,由于填充/对齐,它将进一步变为16个字节.
那么在C++中有一种方法可以保持大小Derived
等于double
(通常为8个字节)的大小吗?标准说的大小是Derived
什么?特别是,在这种情况下,MSVC++如何表现?
这称为空基优化,它在标准中定义如下:
1.8 C++对象模型[intro.object]
7除非它是位字段(9.2.4),否则大多数派生对象应具有非零大小,并且应占用一个或多个字节的存储空间.基类子对象可以具有零大小.平凡可复制或标准布局类型(3.9)的对象应占用连续的存储字节.
8除非对象是零字段或零大小的基类子对象,否则该对象的地址是它占用的第一个字节的地址.如果一个嵌套在另一个中,则具有不是位字段的重叠生存期的两个对象a和b可以具有相同的地址,或者如果至少一个是零大小的基类子对象并且它们具有不同类型,则它们可以具有相同的地址.否则,他们有不同的地址.
在您的示例中,继承Base
类不会影响类的大小Derived
.但是,MSVC++仅对第一个空基类执行此类优化,因此从添加的空基类继承将导致Derived
类大小的增长.我相信这已经成为对MSVC++很长时间的批评,因为许多其他编译器都没有这个问题.如果你有很多小辅助类,这可能真的很麻烦.作为一种变通方法,可以使用派生模板基类将多重继承转换为单继承链:
class Base1
{};
template< typename TBase > class Base2: public TBase
{};
template< typename TBase > class Base3: public TBase
{};
class Derived: public Base3< Base2< Base1 > >
{};
Run Code Online (Sandbox Code Playgroud)
MS Connect错误页面.看起来他们毕竟不打算修复它.
归档时间: |
|
查看次数: |
115 次 |
最近记录: |