C++ 可以将boost::any或boost::variant与boost::pool一起使用吗?
boost::any: 我尝试编译并运行以下代码来测试这一点: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);
#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?