当我研究STL时,我已经通过分配器,我在互联网上发现了很多东西,或多或少我理解他们做了什么.我看过一个Custom Allocator来看看它们是如何实现的,但我的问题是它们是如何被容器使用的,让我们说到Vector中?
他们总是说vector正在使用DEFAULT Allocator.例如,空向量构造函数是:
explicit vector (const allocator& alloc = allocator());
Run Code Online (Sandbox Code Playgroud)
但是vector如何使用allocator?
在场景后面的vector何时何地使用Allocator :: allocate()和Allocator :: construct()?
知道了,为什么需要自定义分配器,它会改变什么?
正如 @BenjaminLindley 提到的,容器内有很多地方可以使用分配器。一个例子是push_back,它使用分配器特征在容器内构造其参数的副本。
标准(23.2.3)描述push_back为:
Run Code Online (Sandbox Code Playgroud)a.push_back(t)附加 t 的副本。要求:T 应可复制插入到 X 中。
后来,术语 CopyInsertable 定义为:
T is CopyInsertable into X 意味着,除了 T 可以 MoveInsertable into X 之外,以下表达式也是格式正确的:
Run Code Online (Sandbox Code Playgroud)allocator_traits<A>::construct(a, p, t)
...可以变成:
Run Code Online (Sandbox Code Playgroud)a.construct(p, t)
...它有效地使用分配器来构造at locationa的副本。tp