编译器支持STL容器中的有状态分配器
compiler support for stateful allocators in STL containers
新的c++ 11标准要求STL实现支持容器中的有状态分配器。主要的STL实现(Visual Studio 2008, 2010, libstdc++)现在符合这个要求吗?我在MSDN或libstdc++文档中没有找到任何关于此的信息。
看起来STL容器中有状态分配器的特性已经得到了广泛的支持。在大多数情况下,分配器的状态完备性不会造成麻烦。尚未得到广泛支持的是新标准处理有问题情况的方式(交换容器(是否也交换分配器),列表的拼接)。
这个线程说:
在大多数当前标准库(包括MS使用的Dinkumware)的代码中,支持有状态分配器
这句话(libstdc++, 2004)说(如果我理解正确的话):
我们已经支持
l1.get_allocator() != l2.get_allocator()
。我们没有做任何特殊的规定来检测splice()
和swap()
中的分配器。
这个博客条目(libstdc++, 2009)说:
c++ 0x模式下的现有容器现在与有状态分配器一起使用时会更高效(即,在元素构造时不会动态创建分配器)。
这个文档介绍了新的libc++库:
所有容器满足所有最新的分配器要求它们完全支持有状态分配器。-为无状态分配程序优化了空间。
EASTL支持有状态分配器
这个线程包含了一个有趣的争论,关于这个特性的可移植性。
所以大多数STL实现都支持有状态的分配器,这意味着它们不会在底层创建分配器类型的额外实例,而是存储客户端提供的分配器实例,所有的分配/释放都是通过它完成的。然而,他们处理swap
ping和list::splice
的方式是未记录的,不可移植的。
UPDATE: VS2008的STL要求分配器具有模板化的复制构造函数,这使得自定义分配器最重要的用途不可能实现:简单的隔离存储。
对于STL中有状态分配器的当前状态不满意的人,我建议考虑Boost.Intrusive
和Boost.Container
。
g++还不支持作用域分配器。
VS2010支持某些非标准分配器,但显然不支持标准分配器
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- 将 std::allocate_shared 与多态资源分配器一起使用
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- std::future_error:无关联状态
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 如何避免LED在循环状态变化中闪烁?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++11 个有状态分配器,带有 std::basic_string<> g++ 6.3.0
- 如何将自定义分配器的完全相同状态传递给多个容器?
- 复制有状态分配器:标准库分配器语义和内部内存
- 分配器无状态意味着什么?
- 这是存储 std::分配器状态的正确方法 - 在这种情况下,由 Windows 上的共享内存支持
- 考虑到副本构造的要求,我如何在C++11中编写一个有状态分配器
- 编译器支持STL容器中的有状态分配器
- std::vector::swap()和有状态分配器是否应使所有迭代器无效
- 有没有比编写存储对有状态分配器对象的引用的包装器分配器更好的方法