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

Smart pointer with small object optimization

本文关键字:智能 指针 功能 优化 对象      更新时间:2023-10-16

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

由于这些类中的大多数都没有成员,所以在堆上创建它们并传递unique_ptr感觉像是在浪费资源。

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

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

关于如何实现这一点,我有两个问题。

首先,如何检测此类类?它不是微不足道的可移动的,因为有虚拟功能。

其次,记住这样的类安全吗?

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

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

#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的骗局中得到任何好处。