加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – STL的allocator_traits中静态成员函数的用途是什么?

发布时间:2020-12-16 10:11:50 所属栏目:百科 来源:网络整理
导读:我正在尝试实现一个STL样式的容器类,我有一个关于在我的类中使用allocator的问题: STL的allocator_traits中静态成员函数的用途是什么? 到现在为止,我认为我应该实例化allocator_type(可能通过某种空基础优化来改善内存占用).因此,我最终会得到这样的结论:
我正在尝试实现一个STL样式的容器类,我有一个关于在我的类中使用allocator的问题:

STL的allocator_traits中静态成员函数的用途是什么?

到现在为止,我认为我应该实例化allocator_type(可能通过某种空基础优化来改善内存占用).因此,我最终会得到这样的结论:

struct EmptyBaSEOpt : allocator_type
{
  EmptyBaSEOpt(const allocator_type & a,allocator_type::const_pointer p)
  : allocator_type(a),prefix_ptr(p) { }

  allocator_type::pointer prefix_ptr;
}

EmptyBaSEOpt ebo;

然后,我可以通过以下方式使用分配器:

allocator_type & alloc = ebo;
alloc.allocate(100,ebo.prefix_ptr);

另一方面,C 11中的allocator_traits似乎意味着以下用法:

std::allocator_traits<allocator_type>::allocate(100,ebo.prefix_ptr);

我想这个静态分配成员函数可能会通过其默认构造函数创建一个临时的临时实例allocator_type.但这导致了以下问题:

>如果allocator_type是有状态分配器会发生什么?如果我在allocator_traits中使用静态成员函数而不是从allocator_type实例调用非静态方法,那么这样的分配器是否能够保持其状态?
>如果我可以直接使用allocator_traits中的静态成员函数,为什么我要实例化allocator_type而烦恼像EBO这样的东西呢?
>如前所述,我的理解是,任何类类模板参数都应该在我的容器类中实例化,以便允许这些参数的有状态版本.这种理解是否正确,它如何适应allocator_traits中的静态成员函数?

解决方法

你好像错过了allocator_traits中的所有静态成员函数都采用了Alloc&作为第一个参数.也就是说,他们使用分配器类型的对象来完成他们的工作.

这种“仅通过allocator_traits访问分配器”策略的原因是allocator_traits的某些成员提供分配器操作的默认实现(如果分配器类型本身不提供).这适用于在C 11中添加到分配器要求但在C 03中不存在的所有成员.示例是construct,如果分配器类型不提供合适的构造函数,它将调用placement new operator :: new.因此,这些默认值允许为C 03编写的分配器在C 11容器中保持不变.

此外,使用allocator_traits可以实现更多的自定义性.可以为特定的分配器类指定allocator_traits,并且可以通过Alloc& amp;上的不同调用来实现特征函数.参数.

因此,您实例化allocator_type的假设是正确的.区别在于您不应该直接调用其成员函数(因为它们可能不存在),而是通过allocator_traits中的静态访问器调用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读