零大小的结构

val*_*ldo 15 c++

根据C++标准(继承自C),空结构仍然具有非零大小.这个(可怜的恕我直言)的原因是两个不同的变量应该有不同的地址.现在,继承一个空结构并不总是"膨胀"该对象.但在某些情况下情况就是这样.

我有一个相当复杂的类架构,涉及激烈的模板巫术.结果,最后的类(我需要创建的实例)可能有几个继承的空结构.由于这个事实,他们中的一部分最终可能会被夸大.最糟糕的是,他们的内存布局实际上取决于继承的顺序.

如果有可能的话,我想摆脱这一切.

是否有一个C++编译器可以配置为消除这种空间浪费,实际上是打破标准的代价?

编辑:

我是说这个:

struct Empty1 {};
struct Empty2 {};

struct NonEmpty {
    int Value;
};

struct MyClass1
    :public NonEmpty
    ,public Empty1
    ,public Empty2
{
};

struct MyClass2
    :public Empty1
    ,public NonEmpty
    ,public Empty2
{
};

struct MyClass3
    :public Empty1
    ,public Empty2
    ,public NonEmpty
{
};

STATIC_ASSERT(sizeof(MyClass1) == 8);
STATIC_ASSERT(sizeof(MyClass2) == 4);
STATIC_ASSERT(sizeof(MyClass3) == 8);
Run Code Online (Sandbox Code Playgroud)

不仅空结构会使对象膨胀(当多个这样的东西继承时),而且结果还取决于空结构的继承顺序.

K-b*_*llo 5

空基类优化是什么让一个空基地,而不是“充气”的对象,你怎么称呼它。但是,您必须小心,以免对象不会从同一个空基继承两次,否则将不允许这种优化。避免这种情况的一种方法是对空基进行模板化,实例化它们,以便不会多次继承相同的空模板实例。

如果您的基类用于标记具体类,那么您可以考虑将您的设计更改为非侵入式设计。


Chr*_*cke 5

您会发现,在大多数现代 C++ 编译器中:

struct a { }; // empty struct
struct b : a { int x}; // inherits from empty struct.

assert(sizeof(b)==sizeof(int)); // despite sizeof(a) >0
Run Code Online (Sandbox Code Playgroud)

实际上,这能减轻您的担忧吗?


Rob*_*obᵩ 2

是否有一个 C++ 编译器可以配置来消除这种空间浪费,...

是的。海湾合作委员会-4.3.4

...实际上以违反标准为代价?

不,标准允许您期望的行为。