我应该将分配器作为类中的成员变量吗?

问题描述 投票:0回答:2

如果我想创建一个使用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),我的对象大小也会加倍。

c++ allocator
2个回答
0
投票

如果只使用默认的standard library allocator,则不必在类中将分配器保留为字段。

std :: allocator类模板是所有人使用的默认分配器标准库容器(如果没有用户指定的分配器)提供。默认分配器是无状态的,即所有实例给定分配器的可以互换,相等并可以取消分配相同对象的任何其他实例分配的内存分配器类型

[使用模板时-API用户可以指定一些自定义状态为全的分配器,在这种情况下,您将需要一个feed。

以及您始终可以直接使用new[]/delete[],而无需任何分配器。或者,您可以重写func_that_allocates以仅使用堆栈存储器。即:用std::vector替换任何std::array,用std::string替换任何char tmp_str[128] = {'\0'};等。


0
投票

即使分配器为空,它仍然会影响对象的大小。在C ++ 20中,我们将使用[[no_unique_address]] attribute解决此问题。您将能够编写:

[[no_unique_address]]

对于空类template<class Alloc> class S { int member; [[no_unique_address]] Alloc allocator_; }; Empty_allocator等于sizeof(S<Empty_allocator>)

没有此属性,标准技巧是使用sizeof(int),从分配程序派生您的类。

© www.soinside.com 2019 - 2024. All rights reserved.