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

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

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

使用C ++(而不是C)的主要动机是C ++标准库提供的所有algorithm和集合std::mapstd::vector

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

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

或者我应该使用显式的分配器模板参数设置为一些gc_allocator所有集合模板? 我不明白第二个模板参数(分配器)对std :: vector的作用吗? 是用来分配vector内部数据还是分配每个单独的元素?

那么std::string -s呢? 如何使他们的数据GC分配? 我应该有我自己的string,使用basic_string模板与gc_allocator ? 有没有办法让GC_malloc_atomic而不是GC_malloc分配的char内部数组?

或者你build议不要使用Boehm GC与g ++编译的应用程序?

问候。

部分地回答我自己的问题,下面的代码

 // file myvec.cc #include <gc/gc.h> #include <gc/gc_cpp.h> #include <gc/gc_allocator.h> #include <vector> class Myvec { std::vector<int,gc_allocator<int> > _vec; public: Myvec(size_t sz=0) : _vec(sz) {}; Myvec(const Myvec& v) : _vec(v._vec) {}; const Myvec& operator=(const Myvec &rhs) { if (this != &rhs) _vec = rhs._vec; return *this; }; void resize (size_t sz=0) { _vec.resize(sz); }; int& operator [] (size_t ix) { return _vec[ix];}; const int& operator [] (size_t ix) const { return _vec[ix]; }; ~Myvec () {}; }; extern "C" Myvec* myvec_make(size_t sz=0) { return new(GC) Myvec(sz); } extern "C" void myvec_resize(Myvec*vec, size_t sz) { vec->resize(sz); } extern "C" int myvec_get(Myvec*vec, size_t ix) { return (*vec)[ix]; } extern "C" void myvec_put(Myvec*vec, size_t ix, int v) { (*vec)[ix] = v; } 

当用g++ -O3 -Wall -c myvec.cc编译时g++ -O3 -Wall -c myvec.cc产生一个对象文件

  % nm -C myvec.o U GC_free U GC_malloc U GC_malloc_atomic U _Unwind_Resume 0000000000000000 W std::vector<int, gc_allocator<int> >::_M_fill_insert(__gnu_cxx::__normal_iterator<int*, std::vector<int, gc_allocator<int> > >, unsigned long, int const&) U std::__throw_length_error(char const*) U __gxx_personality_v0 U memmove 00000000000000b0 T myvec_get 0000000000000000 T myvec_make 00000000000000c0 T myvec_put 00000000000000d0 T myvec_resize 

所以在生成的代码中没有普通的malloc或::operator new

所以通过使用gc_allocatornew(GC)我显然可以确信,在我不知道的情况下,plain ::opertor newmalloc是不会被使用的,我不需要重新定义::operator new


附录(2017年1月)

为了将来的参考(谢谢谢尔盖·祖布科夫在评论中提到Quora ),另请参阅n2670和<memory>和垃圾收集支持 (如std :: declare_reachable , std :: declare_no_pointers , std :: pointer_safety等等) 。 然而,至less在目前的海湾合作委员会(GCC)或铿锵(Clang)中尚未实施(除了使其成为无效的简单但可接受的方式)。