我想开发一个多线程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_atomic不GC_malloc?
或者您是否建议不要将Boehm GC与g ++编译的应用程序一起使用?
问候.
前言:我正在优化一个旧的代码库。
我有一个命名的类Token,我为令牌的子集(但不是全部)添加了缓存。缓存的令牌可能不会被删除,因为它们的指针在程序的整个生命周期内都存储在内存中的永久集合中。
不幸的是,代码库delete token到处都是。所以我所做的是添加一个bool cached从内部检查的成员Token::operator delete和析构~Token()函数,如果cached为真,它会立即从这些各自的函数返回。
我的问题是,这是未定义的行为,还是我可以这样做?delete在没有被删除的东西上执行操作符可以吗?或者这会在未来咬我吗?
class Token
{
bool cached;
void* data;
public:
~Token()
{
if (this->cached) return;
free(data);
}
void operator delete(void* p)
{
if (((Token*)p)->cached) return;
::operator delete(p);
}
// operator new, constructor etc.
}
Run Code Online (Sandbox Code Playgroud)