要保存任意大的对象,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.
如果我正确理解了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)