假设您开发了一个要与std::vector
一起使用的优化自定义分配器(例如,对于小分配,自定义分配器从堆栈而不是堆中获取内存,比如std::string
的SSO;或者它在Windows上使用例如VirtualAlloc
分配大块内存,然后从一个块内部分割单个分配,只是增加一个指针)。
typedef std::vector<T, OptimizedAllocator<T>> OptimizedVector;
如何在从函数返回向量的上下文中使用它,比如这个?
OptimizedVector DoSomething()
{
OptimizedVector<int>::allocator_type alloc{};
OptimizedVector<int> v{alloc};
// Do stuff...
return v;
}
在函数范围的末尾,分配器对象被销毁,因此返回的向量可能包含垃圾,对吗?
另一种方法可能是将allocator对象作为参考传递给每个函数作为附加参数,但这有点难看......
有没有办法在向量中安全“嵌入”分配器对象?
你如何解决这个问题?
答案 0 :(得分:3)
分配器必须是CopyConstructible而没有异常,之后a1 == a2
必须保持(意味着它们共享相同的内存池)。我强烈建议您阅读this page on the Allocator concept。
std::vector
存储您提供的分配器的副本。
因此,如果您正确实施分配器以便安全复制,那么您的代码就没有问题。
答案 1 :(得分:2)
分配器按照标准的定义保存:
n4140§23.2.1[container.requirements.general] / 8
除非另有说明,否则本条款中定义的所有容器 使用分配器获取内存[...]此分配器的副本是 用于执行任何内存分配[...]
vector
未“另行指定”。
这也意味着你的分配器应该支持复制,如果它需要状态,它可能是真正的分配器的句柄。
答案 2 :(得分:0)