C标准库和Boehm垃圾收集器

前端之家收集整理的这篇文章主要介绍了C标准库和Boehm垃圾收集器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我想开发一个多线程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 and garbage collection support(如std::declare_reachable,std::declare_no_pointers,std::pointer_safety等…).然而,至少在目前的GCC或Clang中,尚未实施(除了以微不足道但可接受的方式使其成为无操作).

猜你在找的Linux相关文章