C++垃圾收集编译器

aar*_*man 2 c++ garbage-collection c++11

有谁知道一个支持垃圾收集的c ++的好编译器.我知道他们正在考虑c ++ 11,但没有实现它.

Ulr*_*rdt 6

最常听到的方法之一是使用Hans Boehm的GC,它可以插入到C++中.当然,另一种方法是使用智能指针来跟踪对象的使用.

对于那些赞成"谁需要这个"评论的人来说,答案是它可能更昂贵:

  • 想象一下你fork()你的程序,现在开始调整对象中的refcounters,否则保持不变.这将导致性能开销,因为这意味着操作系统无法在两个进程之间共享内存,即它会破坏写时复制.在某些情况下,这可能意味着操作系统必须仅在内存中交换以复制和调整参考计数器.
  • 另一个例子是建议的东西boost::shared_ptr.这些中的每一个都具有额外的分配作为开销以便存储参考计数器,弱参考计数器和删除器.这也不是免费的.此外,其实例的大小是指针的两倍.
  • 然后,如果您使用正常size_t进行refcounter和内置递增/递减,则代码不是多线程安全的.但是,如果使用原子整数,则递增和递减需要花费更多时间来刷新缓存,因为它不允许重新排序.请记住,每次复制这样的指针时,都必须增加引用计数器.每次销毁一个实例时,都必须再次递减计数器.保持引用计数可以累积到更高的开销,使用标记和扫描GC来偶尔计算引用.
  • 最后,refcounted指针需要程序员积极考虑循环的可能性.GC可以自动检测和中断循环.

如果您牢记上述内容,那么GC就是另一种选择.它确实有缺点,比如非确定性清理,但是Java和C#表明你可以忍受这个,并且没有任何东西可以让你在你真正需要的地方自己编程.

  • 第2个子弹:`std :: make_shared`避免了额外的分配,它合并了两个.这改善了参考的局部性并减少了碎片.这也减少了缓存刷新的代价,因为对象通常与其计数一起刷新.(第3个子弹).当然,如果你使用`fork`,这种共享会放大COW问题. (3认同)