【发布时间】:2017-10-26 12:51:35
【问题描述】:
考虑以下继承:
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; }
};
此代码段将在模板代码库中使用。多态不是一个选项,因为它增加了 VTable 指针,从而使内存消耗加倍。
但是,我怀疑由于 C++ 要求对象的大小至少为 1 字节,Derived 的大小将变为 9 字节,因此,由于填充/对齐,它将进一步变为 16 字节。
那么在 C++ 中有没有办法让 Derived 的大小等于 double 的大小(通常是 8 个字节)?
标准对Derived 的大小有何规定?
特别是,MSVC++ 在这种情况下的表现如何?
【问题讨论】:
-
@AndyG,我不喜欢
pack(1),因为虽然我会通过使Derived9 个字节长来节省内存,但我会因为未对齐访问double值而受到巨大的惩罚,我将失去有效使用 AVX2 的可能性。 -
或者,您可以使用 C++11(我忘记了这一点的额头拍打)使用
alignas强制它 -
您可以在 MSVC 中检查自己。试试
constexpr auto test = sizeof(Derived);。 Intellisense 应该可以为你提供test的值,你甚至不需要编译。 -
它可能已经是 8 个字节了 - 但请检查一下 - 这是由于 空基类优化。查一下。
标签: c++ generics inheritance size sizeof