要保存任意大的对象,boost::any
/ std::any
当然需要为对象分配堆空间.但是,对于大小小于或等于指针(int,char,bool,...
)的小类型,any
可以将值存储在指针槽或其他一些就地内存中,而不是分配堆空间.但实施是否这样做?
我有一个场景,我经常将小型类型存储在一个any
只有string
s 类型的大型类型中.代码非常热,因此我在问这个问题.如果没有执行优化,我可能会更好地使用自己的实现来存储小型类型.
没有保证,但[any.class]中的C++ 17草案规定了这一点
实现应该避免为小的包含对象使用动态分配的内存.[示例:构造的对象仅包含int.-端示例]这种小物体优化应仅被应用于类型
T
为哪些is_nothrow_move_constructible_v
是true
.
不幸的是,除了说应该能够存储到位之外,它没有给出应该被视为小的建议int
.
如果我正确理解了Boost.Any源代码,并且在调试器中对其进行了调用,则它不会应用小对象优化.(注意无条件使用新的.)
templateany(const ValueType & value) : content(new holder< BOOST_DEDUCED_TYPENAME remove_cv ::type>::type >(value)) { }