实现任意类型擦除的小缓冲区优化的简单方法(例如在 std::function 中)。

2024-03-14

我倾向于使用很多类型擦除技术。 它通常看起来像这样:

class YetAnotherTypeErasure
{
public:
   // interface redirected to pImpl
private:
   // Adapting function
   template ...
   friend YetAnotherTypeErasure make_YetAnotherTypeErasure (...);

   class Interface {...};

   template <typename Adaptee>
   class Concrete final : public Interface { 
     // redirecting Interface to Adaptee
   };

   std::unique_ptr<Interface> pImpl_; // always on the heap
};

std::function做了类似的事情,但它有一个小的缓冲区优化,所以如果Concrete<Adaptee>小于 smth 并且没有任何移动操作,它将被存储在其中。是否有一些通用的库解决方案可以相当容易地做到这一点?为了强制只在编译时存储小缓冲区?也许已经提出了一些标准化建议?


我对小缓冲区优化一无所知required尽管通常是允许或鼓励的,但仍受标准或任何提案的约束。

Note that some (conditionally) non-throwing requirements on such types effectively require the optimization in practice because alternatives (like non-throwing allocation from emergency buffers) seem insane here.

另一方面,您可以基于标准库(例如std::aligned_storage)。从用户的角度来看,这可能仍然很冗长,但并不太难。

实际上我实现了(当时不建议)any有了这样的优化 https://osdn.net/projects/yslib/scm/hg/YSLib/blobs/ca54ab668d0f58df952225b2f5b10420756699a5/YBase/include/ystdex/any.h and 一些相关的实用程序 https://osdn.net/projects/yslib/scm/hg/YSLib/blobs/ca54ab668d0f58df952225b2f5b10420756699a5/YBase/include/ystdex/any_iterator.hpp几年前。最近,libstdc++ 的实现std::experimental::any使用的技术几乎与此完全相同(但是,__带前缀的内部名称对于普通库用户来说肯定不好)。

我的实现现在使用一些常见的帮手 https://osdn.net/projects/yslib/scm/hg/YSLib/blobs/ca54ab668d0f58df952225b2f5b10420756699a5/YBase/include/ystdex/type_pun.hpp来处理存储。这些助手确实可以轻松实现类型擦除存储策略(至少适合类似于any足够的)。但我仍然对更通用的高级解决方案感兴趣,以简化界面重定向。

还有a function执行 https://osdn.net/projects/yslib/scm/hg/YSLib/blobs/ca54ab668d0f58df952225b2f5b10420756699a5/YBase/include/ystdex/function.hpp直接基于any上面的实现。它们支持仅移动类型和合理的分配器接口,同时std一些则不然。这function实施的性能比std::function在 libstdc++ 中,在某些情况下,得益于底层的(部分无操作)默认初始化any object.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现任意类型擦除的小缓冲区优化的简单方法(例如在 std::function 中)。 的相关文章

随机推荐