根据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)
不仅空结构会使对象膨胀(当多个这样的东西继承时),而且结果还取决于空结构的继承顺序.
在空基类优化是什么让一个空基地,而不是“充气”的对象,你怎么称呼它。但是,您必须小心,以免对象不会从同一个空基继承两次,否则将不允许这种优化。避免这种情况的一种方法是对空基进行模板化,实例化它们,以便不会多次继承相同的空模板实例。
如果您的基类用于标记具体类,那么您可以考虑将您的设计更改为非侵入式设计。
您会发现,在大多数现代 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)
实际上,这能减轻您的担忧吗?
| 归档时间: |
|
| 查看次数: |
3384 次 |
| 最近记录: |