boost :: any/std :: any是否存在就地的小对象?

gex*_*ide 14 c++ boost c++17

要保存任意大的对象,boost::any/ std::any当然需要为对象分配堆空间.但是,对于大小小于或等于指针(int,char,bool,...)的小类型,any可以将值存储在指针槽或其他一些就地内存中,而不是分配堆空间.但实施是否这样做?

我有一个场景,我经常将小型类型存储在一个any只有strings 类型的大型类型中.代码非常热,因此我在问这个问题.如果没有执行优化,我可能会更好地使用自己的实现来存储小型类型.

Nat*_*ica 15

没有保证,但[any.class]中的C++ 17草案规定了这一点

实现应该避免为小的包含对象使用动态分配的内存.[示例:构造的对象仅包含int.-端示例]这种小物体优化应仅被应用于类型T为哪些is_­nothrow_­move_­constructible_­v<T>true.

不幸的是,除了说应该能够存储到位之外,它没有给出应该被视为的建议int.

  • @NathanOliver不是真的.随着"任何<16>"与"任何<42>"不同类型的"任何"的扩散,使得具有这种词汇类型的目的的一半失败. (10认同)
  • 如果最大尺寸可以被指定为模板参数(默认值为现在的任何值),本来会很好 (3认同)

Jos*_*ley 6

如果我正确理解了Boost.Any源代码,并且在调试器中对其进行了调用,则它不会应用小对象优化.(注意无条件使用新的.)

    template<typename ValueType>
    any(const ValueType & value)
      : content(new holder<
            BOOST_DEDUCED_TYPENAME remove_cv<BOOST_DEDUCED_TYPENAME decay<const ValueType>::type>::type
        >(value))
    {
    }
Run Code Online (Sandbox Code Playgroud)