C++ 自定义分配器

C++ 自定义分配器,c++,c++11,vector,stl,C++,C++11,Vector,Stl,我正在尝试为STL使用自定义分配器。我试过下面的样品。它阻止 将Custom::vector指针分配到std::vector。以下方式是否存在任何缺点或性能问题 namespace Custom { template <typename _Tp, typename Allocator = CustomAllocator<_Tp> > class vector : private std::vector<_Tp, Allocator > {

我正在尝试为STL使用自定义分配器。我试过下面的样品。它阻止 将
Custom::vector
指针分配到
std::vector
。以下方式是否存在任何缺点或性能问题

namespace Custom
{
  template <typename _Tp, typename Allocator = CustomAllocator<_Tp> >
  class vector : private std::vector<_Tp, Allocator >
  {
    using std::vector<_Tp, Allocator>::push_back;
  };
}

int main(void)
{
  Custom::vector<int> v;
  v.push_back(1);
}
命名空间自定义
{
模板
类向量:私有std::vector
{
使用std::vector::push_-back;
};
}
内部主(空)
{
自定义::向量v;
v、 推回(1);
}


分配的性能显然取决于CustomAllocator的实现。

考虑到几乎没有关于您尝试执行的操作、需要兼容的地方和不需要兼容的地方的信息,因此几乎不可能回答这个问题

假设using声明位于派生类型的visible(即
public
)部分,这是缩小接口范围并设置不同分配器的一种方法。这里有不同的关注点,其中之一是,只有在
Custom::vector
friend
的上下文中,向量才能用作
std::vector
,这意味着外部代码将无法将
Custom::vector
转换为
std::vector
,这可能是好事,也可能是坏事。如果需要外部代码才能将
Custom::vector
用作
std::vector
(通过指针或引用),则可以公开继承,或者删除类型,只提供类型别名(如果唯一的目的是将分配器默认为与
std::allocator
不同的值)

另一个问题,它在C++分配器模型中基本上无处不在,就是不再有词汇表类型。

std::vector的两种不同实例化(或仅在分配器上不同的
Custom::vector
是不相关的类型,不能互换使用。您不能编写一个函数,它接受
std::vector
并用
std::vector
调用。同样,这可能是一个问题,也可能不是问题,可以通过到处使用模板来解决(要么以迭代器的形式操作,要么以分配器类型的模板操作)


关于最后一点,有一个建议,将一个多态分配器添加到C++标准中,并且存在一个现有的实现。(代码无需模板化,

bsl::vector
是相同的类型,无论使用哪个分配器来提取内存。动态调度的成本是大是小,有待讨论(委员会目前正在讨论)一些初始性能测试似乎表明动态调度的代价是最小的,但性能最好的(固定的缓冲器,顺序的)分配器。在上下文中,它的含义是:选择正确的分配器将给C++模型中的增益和较小的增益(常数因子)。在BSL分配器模型中。当分配成本较小时,常数因子更为明显。优点是
BSL::vector
是一种词汇表类型,采用
BSL::vector
的函数不关心分配器在使用什么,它只起作用。

您想实现什么?只需要使用c默认情况下是ustom分配器,还是您试图限制可以在
v
上调用哪些方法?我们希望使用customer分配器,因为我们希望分配器使用静态内存池,并且我们也希望限制这些方法。我们希望vector的功能很少,但默认情况下对少数模块使用自定义分配器[不是全局范围]。为什么不简单地使用类型别名
命名空间自定义{template using vector=std::vector;}
?注意:禁止使用
\u Tp
作为模板参数名(对于临时用户),标识符匹配以下正则表达式:
^[a-Z]\w*
\w*.\uuw*
保留给所有作用域中的实现,匹配
^[a-z]\w*
的标识符保留给全局作用域中的实现。我尝试了命名空间自定义{template using vector=std::vector;}。看起来我们需要g++4.8版本的g++;我们使用的编译器不是4.8版本。感谢您的反馈。