相关疑难解决方法(0)

考虑到复制构造的要求,如何在C++ 11中编写有状态分配器?

据我所知,对于与STL容器一起使用的分配器的要求在C++ 11标准的第17.6.3.5节的表28中列出.

我对其中一些要求之间的相互作用感到有些困惑.给定一个类型X是类型分配器T,一类Y是"相应的allocator类"的类型U,实例a,a1a2X,和实例bY,表说:

  1. 表达式仅在分配的存储可以被解除分配时a1 == a2评估,反之亦然.truea1a2

  2. 表达式X a1(a);格式正确,不会通过异常退出,之后a1 == a也是如此.

  3. 表达式X a(b)格式正确,不会通过异常退出,然后退出a == b.

我读到这一点时说,所有分配器必须是可复制构造的,使得副本可以与原件互换.更糟糕的是,跨类型边界也是如此.这似乎是一个非常繁重的要求; 据我所知,它使大量类型的分配器变得不可能.

例如,假设我有一个我想在我的分配器中使用的freelist类,以便缓存释放的对象.除非我遗漏了某些东西,否则我无法在分配器中包含该类的实例,因为大小或对齐的TU可能不同,因此freelist条目不兼容.

我的问题:

  1. 我的解释是否正确?

  2. 我在一些地方读到C++ 11改进了对"有状态分配器"的支持.考虑到这些限制,情况如何?

  3. 你有什么建议可以做我想做的事吗?也就是说,如何在分配器中包含特定于分配类型的状态?

  4. 一般来说,分配器周围的语言似乎很草率.(例如,表28的序言假设它a是类型X&,但某些表达式重新定义a.)此外,至少GCC的支持是不符合的.分配器周围的这种奇怪的原因是什么?它只是一个不经常使用的功能吗?

c++ stl allocator c++11

34
推荐指数
3
解决办法
8913
查看次数

C++标准库和Boehm垃圾收集器

我想开发一个多线程C++应用程序(最终大部分C++代码将由应用程序本身生成,可以被视为高级域特定语言)在Linux/AMD64/Debian上使用GCC 4.6(和可能是最新的C++ 11标准).

我真的想在我的所有堆分配中使用Boehm的保守垃圾收集器,因为我想分配new(GC)并且从不打扰delete.我假设Boehm的GC工作得很好.

使用(而不是C)C++的主要动机是在所有的算法和集合std::map... std::vector由C++标准库提供.

Boehm的GC提供了一个gc_allocator<T>模板(在其文件gc/gc_allocator.h中).

我应该重新定义operator ::new为Boehm吗?

或者我应该使用所有集合模板,并将显式的allocator模板参数设置为某些gc_allocator?我不完全理解第二个模板参数(分配器)对std :: vector的作用?它是用来分配矢量内部数据,还是分配每个单独的元素?

什么是std::string-s?如何使他们的数据GC分配?我应该使用basic_string模板gc_allocator吗?有没有办法让内部数组的char分配GC_malloc_atomicGC_malloc

或者您是否建议不要将Boehm GC与g ++编译的应用程序一起使用?

问候.

c++ linux garbage-collection g++

6
推荐指数
1
解决办法
3918
查看次数

标签 统计

c++ ×2

allocator ×1

c++11 ×1

g++ ×1

garbage-collection ×1

linux ×1

stl ×1