Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+有实际用途吗+;11';垃圾收集ABI?_C++_C++11_Garbage Collection - Fatal编程技术网

C++ C+有实际用途吗+;11';垃圾收集ABI?

C++ C+有实际用途吗+;11';垃圾收集ABI?,c++,c++11,garbage-collection,C++,C++11,Garbage Collection,C++11引入了一个。据我所见,它提供了一种标准化的方式来与GC通信(例如),并获取有关如何处理伪装指针的信息(例如) 然而,在C++11中还没有标准化的方法来分配原始内存块,您不必手动释放这些内存块。在某些用例中,即使没有调用析构函数,这也会有所帮助。一个例子是实现高效的并发数据结构(如Herb Sutter所述),而不必处理复杂的清理协议 到目前为止,一切顺利。我的问题(从普通开发者的角度,而不是GC库开发者的角度): 是否有一个新的C++11 GC接口对您有所帮助的真实示例? 至少在我看来

C++11引入了一个。据我所见,它提供了一种标准化的方式来与GC通信(例如),并获取有关如何处理伪装指针的信息(例如)

然而,在C++11中还没有标准化的方法来分配原始内存块,您不必手动释放这些内存块。在某些用例中,即使没有调用析构函数,这也会有所帮助。一个例子是实现高效的并发数据结构(如Herb Sutter所述),而不必处理复杂的清理协议

到目前为止,一切顺利。我的问题(从普通开发者的角度,而不是GC库开发者的角度):

是否有一个新的C++11 GC接口对您有所帮助的真实示例?

至少在我看来,世界没有改变。例如,如果您需要GC,您仍然需要找到一个非标准库,并学习如何集成和使用它。新的标准化界面在这方面没有多大帮助。它也不能解决可移植性问题

(从长远来看,C++11标准定义的通用接口有望获得回报。然而,我的问题只针对近期。)

不,C++11 GC接口目前没有实际用途,因为在此期间没有完全支持此API的编译器。此外,C++11标准将此API声明为可选的,并且在主要编译器中没有看到实现此API的任何动作(但Jesse Good notes MSVC已经支持它)


你也应该看看这篇文章,它有相关的信息:

std::shared\u ptr
提供了所谓的引用计数垃圾收集。它实现起来很简单,但也有一些缺点。具体来说,在许多应用程序中,它的效率低于其他形式的垃圾收集,更重要的是,它不能处理循环引用

java和C++被称为“托管语言”,而不是C++,这被称为“非托管语言”,主要是因为它们实现标记和扫描垃圾收集。标记和清除垃圾收集处理循环引用。它通过逻辑搜索可访问对象的图形,然后定期删除那些不可访问的对象来实现这一点。还有更为复杂的算法对此进行了优化(其中一种称为“分代”),但底层结构只是标记和扫描

在C++中实现标记和扫描的问题是,有很多操作使得跟踪对象图变得困难。“安全派生指针”概念旨在分离并定义这些问题,以便我们可以确定可以使用哪些功能来维护对象图的GCs视图的完整性。然后,编译器应该可以静态地识别和诊断违反这些规则的构造(重新解释强制转换、指针算法等)

那些声称“当你有RAII的时候,为什么你想要垃圾收集”的人感到困惑。RAII是使用所有权概念的一种可能的内存模型。每个对象必须完全由另一个对象拥有,并且该所有者负责其生命周期。对于许多对象模型来说,这并不自然或方便,因为一个对象被其他几个对象引用,并且没有明确的所有者。对于许多应用程序,您希望对象的生命周期在未被引用时自动结束,而Java和C#在“默认情况下”就是这样工作的


我的印象是,新的内存模型和“安全派生对象”概念应该导致在标准库中提供一个真正的可选标记和扫描垃圾收集器。这样一个特性将是非常受欢迎的,但我认为目前还没有。“安全导出的对象”是一个基础。Clang不需要支持,但我的MVC可能会被一个微小但很响亮的少数人所激怒,但是谁会想要C++中的GC呢?我们已经有RAII了,这是任何时候GC,只要C++语义有关。但是,不可否认,它在其他没有相同期望的语言中可能很有用——例如,我是一个Lisp的忠实粉丝,没有GC我无法想象。@syam让我来支持你。垃圾收集是快速程序的最大敌人(除了选择不好的算法)。@H2CO3有趣的是,我的评论并没有引起我所担心的骚动。我想我错认为这是有争议的。(这也是件好事,我喜欢在这种情况下犯错):)谢谢你的链接。这里有一个我发现有用的相关答案:“java和C++被称为”托管语言,而C++被称为“非托管语言”。“这是微软为区分.NET语言和本机语言而创建的唯一术语:@Manu343726:最初可能是这样,但现在这个术语很常用。我的观点是,自动标记和扫描垃圾收集是爪哇/C和C++之间的主要区别。@ USER 1131467只是挑剔,但现在M&S正在逐步淘汰…分代GC越来越流行,良好的ol'引用计数(+循环消除)在受管内存区域越大的情况下(为了提高局部性)获得了很大的吸引力。@syam:Generational GC是标记和扫描的一种优化形式。分代只是意味着您假设对象在很长一段时间内是可访问的,但在大多数时间内仍然是可访问的。逻辑效果和所需的对象图信息与标记和扫描相同。参考计数与周期消除不兼容,所以我不确定你的意思(你能为“获得牵引力”提供一个引证吗?)。引用计数更可取的罕见情况中,最常见的是在实时应用程序中,随机停止GC是不可接受的。@Alex:正如我的post reference中所述