C++ 可以将boost::any或boost::variant与boost::pool一起使用吗?

C++ 可以将boost::any或boost::variant与boost::pool一起使用吗?,c++,boost,boost-variant,boost-any,C++,Boost,Boost Variant,Boost Any,boost::any: 我尝试编译并运行以下代码来测试这一点: #include <boost/any.hpp> #include <boost/pool/object_pool.hpp> int main() { boost::object_pool<boost::any> pool; boost::any *i = pool.malloc(); *i = 1; boost::any *j = pool.construct(2);

boost::any:

我尝试编译并运行以下代码来测试这一点:

#include <boost/any.hpp>
#include <boost/pool/object_pool.hpp>

int main()
{
  boost::object_pool<boost::any> pool;
  boost::any *i = pool.malloc();
  *i = 1;

  boost::any *j = pool.construct(2);

  pool.destroy(i);
  pool.destroy(j);
}
#包括
#包括
int main()
{
boost::对象池;
boost::any*i=pool.malloc();
*i=1;
boost::any*j=pool.construct(2);
销毁(一);
销毁(j);
}
但是它在boost::any析构函数中得到一个segfault

boost::variant:

正在尝试编译和运行以下内容:

#include <boost/any.hpp>
#include <boost/pool/object_pool.hpp>
#include <boost/variant.hpp>

int main()
{
  typedef boost::variant<int, double> my_variant;

  boost::object_pool<my_variant> pool;
  my_variant *i = pool.malloc();
  *i = 1;

  my_variant *j = pool.construct(2);

  pool.destroy(i);
  pool.destroy(j);
}
#包括
#包括
#包括
int main()
{
typedef boost::variant my_variant;
boost::对象池;
我的变量*i=pool.malloc();
*i=1;
my_variant*j=pool.construct(2);
销毁(一);
销毁(j);
}
我得到了以下错误:

a、 out:Visition\u impl.hpp:207:typename访问者::结果类型 boost::detail::variant::Visition_impl(int,int,Visitor&,VPCV, mpl\:true\,NBF,W*,S*)[带W=mpl\:int\;S= boost::detail::variant::Visition\u impl\u步骤, boost::mpl::l_iter>;访问者= boost::detail::variant::invoke\u visitor

;VPCV=void*;NBF=boost::variant::has_fallback_type_u;typename Visitor::result_type=bool; mpl\:true\=mpl\:bool\:断言'false'失败。流产 (堆芯倾倒)


这是预期的行为吗?Boo::池只适用于简单的C++类型,如int、dBle、浮点等?<强>

< p>是的,升压池与二者一起工作。你只是用错了

警告:将池分配器与
boost::any
一起使用实际上毫无用处,因为它将在池外动态分配保留的值

但这并不意味着如果你正确使用它,你就不能

malloc
只分配未初始化的内存。如果您希望能够将其指定为该点所暗示的对象类型的完整功能实例,则这是您的错误

T *i = pool.malloc();
new (i) T();
这就解决了这个问题:

#include <boost/pool/object_pool.hpp>
#include <boost/any.hpp>
#include <boost/variant.hpp>

template <typename T>
void run_test() {
    boost::object_pool<T> pool;

    T *i = pool.malloc();
    new (i) T();
    *i = 1;

    T *j = pool.construct(2);

    pool.destroy(i);
    pool.destroy(j);
}

int main() {
    run_test<boost::variant<int, double> >();
    run_test<boost::any>();
}
#包括
#包括
#包括
模板
无效运行测试(){
boost::对象池;
T*i=pool.malloc();
新(i)T();
*i=1;
T*j=pool.construct(2);
销毁(一);
销毁(j);
}
int main(){
运行_测试();
运行_测试();
}
在asan/ubsan和valgrind下,该系统也运行正常

奖金问题 这是预期的行为吗?Boo::池只适用于简单的C++类型,如int、dBLE、浮点等?< /p>
对于POD类型或琐碎类型,你可以避开构造函数,就像C++编译器被允许在这些情况下躲避它们。

你的警告是说,在Booost中仍然没有任何意义:在池中有任何一个,甚至是你的修正?这就是我说的,是的。显然,这取决于你的用途。如果你想让它们都空着,你可以提高分配效率。如果您希望所有分配都在池中,那么就不是了。对于
boost::variant
来说,部分情况也是如此,但只有在使用
boost::recursive\u wrapper
时才是如此(或者任何其他显式动态指针,如
unique\u ptr
,但我认为这是不言而喻的).我有一组有限的类型,我在性能关键代码中一遍又一遍地更新向量(大部分大小相同的向量),其中新的是当前的瓶颈。你能想出比新内存更快初始化/重新使用内存的方法吗?boost::pool似乎是解决我问题的通用解决方案……听起来你没有使用任何
any
variant
可以,但也可以看看variant是否适合与boost::pool一起使用?或者你指的是Boost PolyCollection?