具有小对象优化功能的智能指针

时间:2018-07-16 19:53:39

标签: c++

我有一个类的层次结构。基类具有虚拟析构函数和一些虚拟方法。大多数派生类根本没有成员。一些派生类具有仅POD成员。

由于大多数此类都没有成员,因此感觉很浪费资源,无法在堆上创建它们并传递unique_ptr

我想使用可以执行小对象优化的智能指针。该指针应将符合以下条件的所有对象存储在特殊的缓冲区中,而不分配新的内存:

  1. 类仅由vtable指针和可微动的成员组成;
  2. 类没有用户定义的移动运算符;
  3. 班级足够小。

我有两个有关如何实施此问题的问题。

首先,如何检测此类?它不容易移动,因为有虚函数。

第二,对此类进行记忆是否安全?

另一个问题:是否有此类的已知实现?

1 个答案:

答案 0 :(得分:0)

不能完全确定根据标准是否严格合法,但是我认为这是检测类是否是多态的和无数据的一种非常可移植的方法:

#include <type_traits>

namespace detail
{
    struct BaselinePoly
    {
        virtual ~BaselinePoly();
    };
}

template<class T>
struct IsDatalessPolymorphic
: std::integral_constant
  <
    bool, 
    std::is_polymorphic<T>::value && sizeof(T) == sizeof(detail::BaselinePoly)
  > 
{
};

struct Foo
{
    virtual ~Foo();
};

struct Bar : Foo {};
struct Baz : Foo { int x; };

int main()
{
    static_assert(IsDatalessPolymorphic<Bar>());
    static_assert(!IsDatalessPolymorphic<Baz>());
}

隐式移动和复制运算符应该非常简单。我怀疑您不会从memcpy的骗局中获益。