[分配器.概念]智能指针说明[英] [allocator.concept] smart pointer clarifications

问题描述

我目前正在编写一个相当稳定的智能指针,并且我
决定支持分配器完成,因为它增加了
共享容器使用的同一个池时的效率.有人告诉我
新标准正在敲定中,我希望是次要但重要的
可以先应用更改.

要快速了解该主题的当前状态,您会发现
在与分配器成员函数 (n2641) 相关的最新文本下方.我们
看看那里返回的指针类型之间没有dictinction
allocate() 和 deallocate() 和 destroy() 期望的指针类型.
这是一个大问题,因为如果聪明,这个逻辑就没有意义了
将使用指针.智能指针是其对象的所有者,并且
绝不会放弃对其对象的外部访问.我们需要
这些功能要使用
1) 与 allocate() 返回的指针类型不同
2)使参数(指针)作为非常量引用传递

后者是对智能指针本身进行更改所必需的
或在使用原始指针的情况下指向的对象.我们可以看到我的
个人实施在这里,我想提出以下建议
函数签名:

模板<typename T>
类shifted_allocator
{
公开:
typedef shifttypedef shift_ptrtypedef shift_ptr
value_type * allocate(size_type s, const void * = 0);
void deallocate(pointer & p, size_type);
void 构造(value_type * p, const T & x);
void destroy(pointer & p);
...
};

** 分配器成员函数 **
1)
指针 X::allocate(size_type n);
指针 X::allocate(size_type n, const_generic_pointer 提示);

效果:为 n 个 value_type 类型的对象分配了内存,但
不构造对象.[脚注:a.allocate 是一个
分配 T 类型的单个对象的有效方法,即使 sizeof(T)
是小.也就是容器不需要自己维护
"免费名单".- end footnote] 可选参数 p,可以

返回: 指向已分配内存的指针.[注:如果n == 0,则返回
值未指定.如果 n 为 1,则程序获得访问权限的方式
第二个和后续分配的对象是在
之外确定的分配器概念.请参阅下面的 RandomAccessAllocator,了解一个常见的
方法.- 尾注]

抛出:allocate 可能引发适当的异常.

备注:提示的使用未指定,但旨在帮助局部性
如果实现如此需要.[注:在容器成员函数中,
相邻元素的地址通常是传递提示的好选择
争论.- 尾注]

2)
void X::deallocate(指针 p, size_type n);

前提条件:p所指区域内的所有n个value_type对象都应为
在此调用之前销毁.n 应匹配传递给分配给的值
获取此内存.[注意:p 不能是单数.- 尾注]

抛出:不抛出异常.

3)
void X::destroy(指针 p);

效果:在 p 处调用对象的析构函数,但不释放它.

问候,
-菲尔

--
[参见http://www.gotw.ca/resources/clcm.htm 获取有关 ]
的信息[comp.lang.c++.moderated.第一次海报:这样做!]

推荐答案

8 月 18 日晚上 7:28*pm,"Phil Bouchard"<p...@fornux.com 写道:
我目前正在编写一个相当稳定的智能指针,并且我
决定支持分配器完成,因为它增加了
共享容器使用的同一个池时的效率.*有人告诉我
新标准正在敲定中,我希望是次要但重要的
可以先应用更改.

要快速了解该主题的当前状态,您会发现
在与分配器成员函数 (n2641) 相关的最新文本下方.*我们
看看那里返回的指针类型之间没有dictinction
allocate() 和 deallocate() 和 destroy() 期望的指针类型.
这是一个大问题,因为如果聪明,这个逻辑就没有意义了
将使用指针.*智能指针是其对象的所有者,并且
绝不会放弃对其对象的外部访问.*我们需要
这些功能要使用
1) 与 allocate() 返回的指针类型不同
2)使参数(指针)作为非常量引用传递

后者是对智能指针本身进行更改所必需的
或在使用原始指针的情况下指向的对象.*我们可以看到我的
个人实施在这里,我想提出以下建议
函数签名:

模板<typename T>
* * 类shifted_allocator
* * {
** 公开:
* * * * typedef shift* * * * typedef shift_ptr* * * * typedef shift_ptr
* * * * value_type * allocate(size_type s, const void * = 0);
* * * * void deallocate(pointer & p, size_type);
* * * * void 构造(value_type * p, const T & x);
* * * * void destroy(pointer & p);
* * * * ...
* * };
[截图]

也许我错过了什么.智能指针一般会接管
分配后的所有权,例如:

tr1::shared_ptrtr1::shared_ptr
shared_ptr 的删除器可以告诉它如何做一些特殊的释放
程序,例如:

tr1::shared_ptrfile(fopen("some.txt","r"),&fclose);

为什么分配器需要了解智能指针?

干杯!--M


"木匠"<ml*****@gmail.com 在留言中写道
新闻:e8************************************@x35g2000 hsb.googlegroups.com...

[...]
也许我错过了什么.智能指针一般会接管
分配后的所有权,例如:

tr1::shared_ptrtr1::shared_ptr
shared_ptr 的删除器可以告诉它如何做一些特殊的释放
程序,例如:

tr1::shared_ptr
为什么分配器需要了解智能指针?

干杯!--M
那么定义分配器的想法是集中在一个
类实例化与内存管理相关的一切.如果
分配器必须在容器和智能之间显式共享
指针本身,那么这个想法就变得毫无意义.分配器应该是
负责所有类型的释放,包括智能指针.
-Phil

8 月 20 日凌晨 4:26*,"Phil Bouchard"<p...@fornux.com 写道:
"木匠"<mlim...@gmail.com 在留言中写道

新闻:e8************************************@x35g2000 hsb.googlegroups.com...

[...]
也许我错过了什么.智能指针一般会接管
分配后的所有权,例如:
*tr1::shared_ptr*tr1::shared_ptr
shared_ptr 的删除器可以告诉它如何做一些特殊的释放
程序,例如:
*tr1::shared_ptr
为什么分配器需要意识到智能指针?

那么定义分配器的想法是集中在一个
类实例化与内存管理相关的一切.*如果
分配器必须在容器和智能之间显式共享
指针本身,那么这个想法就变得毫无意义.*分配器应该是
负责所有类型的释放,包括智能指针.
我还是不明白.假设您正在设计 std::vector,
有一个分配器模板参数.用户是否无关紧要-
定义的类或智能指针(只要它具有值语义).
鉴于此代码:

C类 { */...*/};
//...
std::vector标准::向量
在引擎盖下,后两行中的每一行都将使用vector's
(默认)分配器为
的 10 个实例获取内存包含类型,然后是placement-new来构造
中的实例那个记忆.(请注意,这里所有 shared_ptr 的指针都是空的
点.)为什么分配器要关心它是在制作 C 还是 a
shared_ptr?

干杯!--M

本文地址:https://www.itbaoku.cn/post/1050779.html