【问题标题】:Why does C++11 allow for GC? [closed]为什么 C++11 允许 GC? [关闭]
【发布时间】:2013-01-05 10:31:16
【问题描述】:

C++11 允许其实现执行(某些)垃圾收集实用程序。为什么标准会允许这样做?我一直认为,在 C++ 中,不用为不用的东西付费。对我来说,(隐式)GC 感觉就像它破坏了这种意识形态。此外,通过智能指针在 C++ 中编写和使用显式垃圾收集实用程序并不难。

其次,GC 会使一些原本有效的程序失效。示例包括指针屏蔽和相关的低级指针“hacks”。

int * nums = new int[10];
nums += 2;
*nums = 777; // nothing points to the new'ed int[10] at this point
// oh no! nums could have gotten collected!!! (so lets assume it was)
*nums = 666; // crash (or memory corruption (or something else that's bad))

【问题讨论】:

  • 如果垃圾收集器可以选择释放用于Foo 对象的内存,这并不意味着它必须首先调用Foo 的析构函数。
  • @hvd:对。我已经更新了我的问题
  • @JamesMcNellis 存储为整数的指针值的异或列表以前完全有效。
  • @hvd 好吧,整数和指针之间的转换是依赖于实现的,但是如果实现是这样的,xor 技巧会产生预期的值,那么在 C 中使用该值作为指针是有效的++03。现在使用具有严格指针安全性的 C++11 实现,您必须使用 std::declare_reachable() 才能使此类代码有效。在安全性宽松的实现中,该技巧仍然有效。

标签: c++ c++11 garbage-collection


【解决方案1】:

C++11 标准并不要求 GC 存在,但它可能会出现在未来的版本中。

它不会对您强制执行 - 只有在您请求时才会出现。它不会收集您的普通指针,也不会收集当前的智能指针。所以,它仍然是“不要使用 - 不要为此付费”。它仅适用于您明确要求的指针,因此您的示例仍将像现在一样工作。

Sutter’s Mill: Garbage Collection Synopsis, and C++

引用计数 (#1) 通常是最好的,它是 C++ 的默认值 GC的形式。但是也有理由(而不是)想要懒惰 标记扫描(#2)C ++中的垃圾收集以处理参考文献 计数无法处理,包括潜在周期何时出现 不可避免的(在某些情况下,某些对象可能自然是共享的, 但随后可能会相互引用)和无锁 ABA 问题。

通过“引用计数”,Sutter 指的是std::shared_ptr 和类似的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-05
    • 2010-10-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多