C++ C++;分配者特征::结构:动机,忽略中的权衡

C++ C++;分配者特征::结构:动机,忽略中的权衡,c++,allocation,c++-standard-library,C++,Allocation,C++ Standard Library,我正在努力解决由std::allocator\u traits::construct引起的一些痛苦。为了使容器成为分配器概念的“一致”用户,它需要使用构造而不是放置新对象。这对我来说很粘。目前,我有一个类(类a),它被设计为具有分配器感知能力,并且在某个点上,它需要在分配的内存中创建其他类(类B)的另一个实例。问题是类B实现了新对象的构造。如果我可以使用placement new,这就不会成为问题:A将处理分配,将内存地址传递给B,B将构造到其中。但是由于构造需要通过construct执行,我需

我正在努力解决由
std::allocator\u traits::construct
引起的一些痛苦。为了使容器成为分配器概念的“一致”用户,它需要使用
构造
而不是放置新对象。这对我来说很粘。目前,我有一个类(类a),它被设计为具有分配器感知能力,并且在某个点上,它需要在分配的内存中创建其他类(类B)的另一个实例。问题是类B实现了新对象的构造。如果我可以使用placement new,这就不会成为问题:A将处理分配,将内存地址传递给B,B将构造到其中。但是由于构造需要通过construct执行,我需要将分配器类型注入到B中,对其进行模板化,这会造成巨大的混乱

这已经够糟糕的了,我正在认真考虑只使用placement new,并且静态断言我的分配器实例没有构造方法(请注意,静态构造函数在实例方法存在时调用实例方法,否则调用placement new)。我从未有过为分配器编写构造方法的丝毫冲动。在我看来,制作分配器概念的这一部分的成本非常高;构造已经与分配纠缠在一起,分配程序应该帮助将它们分开。什么可以证明构造/破坏的存在?洞察设计决策、真实(而非玩具)用例的示例,或考虑选择简单使用布局的重要性

还有一个类似的问题。这是很久以前提出的问题,我认为那里接受的答案还不够。作为一个用例,日志记录有点陈腐,即使如此:为什么分配器记录对象的实际构造?它可以在allocate and deallocate中记录分配和取消分配,但它并没有回答以下问题:为什么建筑首先成为分配者的一个省?我希望找到一个更好的答案;这已经有好几年了,从那以后,关于分配器的很多内容都发生了变化(例如,分配器自11年以来一直是有状态的)。

有几点:

  • 实际上没有std容器概念。标准中的容器要求表用于记录标准规定的容器


  • 如果您有一个想要与
    std::allocator\u特性交互的容器。规范并不简单,这就是为什么我不尝试在这里复制它。

    B
    构造本身?带工厂功能还是什么?你可以只是模板化它,而不是整个类
    B
    ?@Brian,这相当复杂。B不是模板,而是涉及继承。B也更面向用户,所以我不想强加模板或工厂之类的要求。