我想开发一个多线程C应用程序(最终大部分C代码将由应用程序本身生成,可以被视为高级域特定语言)在Linux / AMD64 / Debian上使用GCC 4.6(和可能是最新的C 11标准).
我真的想在我的所有堆分配中使用Boehm’s conservative garbage collector,因为我想用new(GC)分配并且从不打扰删除.我假设Boehm的GC工作得很好.
使用C(而不是C)的主要动机是由C标准库提供的所有算法和集合std :: map … std :: vector.
Boehm的GC提供gc_allocator< T>模板(在其文件gc / gc_allocator.h中).
我应该重新定义operator :: new作为Boehm的那个吗?
或者我应该使用所有集合模板,并将显式的allocator模板参数设置为某些gc_allocator吗?我不完全理解第二个模板参数(分配器)对std::vector的作用?它是用来分配矢量内部数据,还是分配每个单独的元素?
那么std :: string-s怎么样?如何使他们的数据GC分配?我应该使用带有gc_allocator的basic_string模板吗?有没有办法获得用GC_malloc_atomic而不是GC_malloc分配的内部数组char?
或者您是否建议不要将Boehm GC与g编译的应用程序一起使用?
问候.
// file myvec.cc
#include
当使用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
因此生成的代码中没有普通的malloc或:: operator new.
所以通过使用gc_allocator和new(GC),我显然可以确定在我不知情的情况下不使用plain :: opertor new或malloc,而且我不需要重新定义:: operator new
附录(2017年1月)
供将来参考(感谢Sergey Zubkov在Quora评论中提及它),另见n2670和
(如std::declare_reachable,std::declare_no_pointers,std::pointer_safety等…).然而,至少在目前的GCC或Clang中,尚未实施(除了以微不足道但可接受的方式使其成为无操作).