STL自定义分配器

时间:2014-08-14 13:21:25

标签: 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 >
  {
    using std::vector<_Tp, Allocator>::push_back;
  };
}

int main(void)
{
  Custom::vector<int> v;
  v.push_back(1);
}

2 个答案:

答案 0 :(得分:1)

没有

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

答案 1 :(得分:1)

鉴于您几乎没有关于您要做什么的信息,您需要兼容的地方以及您不需要的地方,几乎不可能回答这个问题。

假设using声明在派生类型的 visible (即public)部分中,这是一种缩小接口和设置不同分配器的方法。这里有不同的问题,其中之一是仅在Custom::vectorfriend的上下文中,向量可以用作std::vector,这意味着外部代码将无法将Custom::vector<T>转换为std::vector<T, CustomAllocator<T> >,这可能是好事也可能是坏事。如果您需要外部代码才能使用Custom::vector<T>作为std::vector<T, CA<T>>(通过指针或引用),您可以将继承设为公共,或以其他方式删除类型并仅提供类型别名(如果只是意图)是将分配器默认为不同于std::allocator<T>)。

在C ++分配器模型中基本上无处不在的另一个问题是,您不再具有词汇表类型。 std::vector(或Custom::vector仅在分配器上有所不同的两个不同实例是不相关的类型,不能互换使用。您不能编写一个带std::vector<T>的函数并用{{std::vector<T, CA<T>>调用它。 1}}。同样,这可能是也可能不是问题,并且可以通过在任何地方使用模板进行污染来解决(根据迭代器操作,或者在分配器类型上操作)。

关于最后一点,有人建议在C ++标准中添加多态分配器,BSL中有一个现有的实现。权衡是支付每个分配额外的动态调度并获得词汇类型(代码不需要模板化,bsl::vector<T>是相同的类型,无论使用哪个分配器来提取内存。动态调度的成本是否相同是小还是大需要讨论(委员会目前正在讨论)。一些初始性能测试似乎表明,动态调度的成本很小,分配器性能最差但是速度较快(固定缓冲区,顺序)分配器很明显在上下文中考虑它的含义:选择正确的分配器将使您在C ++模型中获得一些收益,并在BSL分配器模型中获得更小的增益(常数因子)。当分配成本为时,常数因子更明显。优势是bsl::vector<T>是一个词汇类型,一个bsl::vector<T>的函数不关心正在使用什么分配器,它只是工作