首页 > 解决方案 > C++ 是否可以编排基类相对于其派生类的偏移量?

问题描述

考虑以下“黑匣子”,

template<std::size_t offset, typename T>
class BlackBox;

其中必须具有以下功能:

class SomeClass; // This class has a virtual destructor
                 // and a default constructor.

constexpr std::size_t offset = alignof(SomeClass);
auto bb = new BlackBox<offset, SomeClass>;
SomeClass* ptr = bb;
assert((char*)ptr - (char*)bb == offset); // OK(!)
delete ptr;  // OK - destructs and deletes bb correctly.

这里offset始终是 的非负倍数alignof(SomeClass),但为了这个问题,您可能会假设它恰好是 1 倍alignof(SomeClass)

此外,您可以假设alignof(SomeClass) <= alignof(std::max_align_t).

如果在(任何)C++ 标准中都不可能,那么您可以假设使用的编译器是最新版本的 g++。

我很清楚这属于“肮脏的编程”;不过我有点“需要它”。问题是是否有可能(以及如何)使用任何可能的黑客攻击。

我尝试了以下方法,但这不起作用

template<std::size_t offset, typename T>
struct Offset {
  typename std::aligned_storage<offset, alignof(T)>::type m_offset;
};

template<std::size_t offset, typename T>
class BlackBox : Offset<offset, T>, public T {
  static_assert(offset % alignof(T) == 0, "");
  using T::T;
};

这里的问题是,不能保证在多继承的情况下基类如何在内存中排序,并且一旦 T 有一个虚拟表,它就会首先放在内存中(通过 g++) - 立即减少计算的偏移量在断言为 0。

标签: c++g++multiple-inheritance

解决方案


推荐阅读