C++ 当使用分配器概念时,如何避免堆栈上的临时对象?

C++ 当使用分配器概念时,如何避免堆栈上的临时对象?,c++,stl,allocator,C++,Stl,Allocator,下面的代码尝试创建二叉树的节点,并向其返回boost::shared_ptr() 查看libstdc++代码,我发现我调用的std::allocator函数如下所示: pointer allocate(size_type __n, const void* = 0) { if (__n > this->max_size()) std::__throw_bad_alloc(); return static_cast<_Tp*>(::operator new(

下面的代码尝试创建二叉树的节点,并向其返回boost::shared_ptr()

查看libstdc++代码,我发现我调用的std::allocator函数如下所示:

pointer
allocate(size_type __n, const void* = 0)
{ 
  if (__n > this->max_size())
    std::__throw_bad_alloc();
  return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
}

void 
construct(pointer __p, const _Tp& __val) 
{ ::new((void *)__p) _Tp(__val); }
指针
分配(大小、类型、常量无效*=0)
{ 
如果(\u\n>此->最大大小())
std::uuu throw_ubad_ualloc();
返回静态类型转换(::运算符new(u n*sizeof(_Tp));
}
无效的
构造(指针、常数和值)
{::新的((空*)u p)u Tp(u val);}
分配器在placement new中使用来分离内存的分配和对象的构造。因此,当确实需要对象时,可以获取大量元素并仅调用构造函数

create_node
函数使用分配器概念创建单个对象,并在需要时使用shared_ptr调用析构函数。为了使这些单次分配变得便宜,我希望稍后替换分配器(因此我希望使用池分配的分配器)


当我调用此函数时,它将在堆栈上创建一个临时实例,然后将节点的元素复制到堆位置。如何强制编译器立即就地创建对象?因此,我需要一个反向命名的返回值优化(NRVO)。这可能吗

你可以使用。

我在使用Linux,我一直在使用C++03,然后使用
中的
std::tr1::allocate_shared
。不幸的是,tech release 1不是C++03的一部分,而是C++0x的一部分,但感谢您的提示,如果编译器确实支持C++11,我可能会添加一些实验特性。或者,因为问题是关于
boost::shared_ptr
@Alex:不,不完全是。在C++11中没有TR1,因为C++11实际上包含所有这些内容,作为实际标准的一部分。相反,TR1是一个C++98/03的库,它早于新标准,并且在很长一段时间内随流行的编译器一起提供。
pointer
allocate(size_type __n, const void* = 0)
{ 
  if (__n > this->max_size())
    std::__throw_bad_alloc();
  return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
}

void 
construct(pointer __p, const _Tp& __val) 
{ ::new((void *)__p) _Tp(__val); }