【发布时间】:2019-11-15 12:06:11
【问题描述】:
如果我想创建一个使用allocators 的类(如自定义字符串类),我是否应该将allocator 实例化为member variable?
// Should I do this ?
template <class Allocator>
class my_class {
Allocator a_;
void func_that_allocates() {
std::allocator_traits<Allocator>::allocate(a_, 10);
}
};
// Or this ?
template <class Allocator>
class my_class {
void func_that_allocates() {
std::allocator_traits<Allocator>::allocate(Allocator(), 10);
}
};
// Or maybe have a_ be a static member ?
我的问题是我正在尝试创建一个节省空间的字符串类,它只存储 char pointer(在 std::variant 以及小的原始类型中使用它),但将 allocator 作为即使使用空的stateless allocator(如std::allocator),成员也会使我的对象的大小翻倍。
【问题讨论】:
-
我记得读过所有分配器实例都是可互换的。因此,如果它成立,您可以像您的第二个版本一样传递一个未命名的临时对象。
-
我认为您可能指的是 Allocator::is_always_equal (参见表格底部的name requirements),它告诉您两个实例对于特定的分配器类型是否可以互换,但遗憾的是不是分配器的要求。
-
你甚至不能假设
Allocator默认可构造,所以你需要从用户那里得到一个Allocator实例。