C++ 如何使用C++;14内存模型的内部工作原理及其与Bacon';s统一的垃圾收集理论
读大卫·培根的 我发现他提到现代地面军事系统是追踪和参考计数的混合体: 考虑到我们发现的两种追踪方法在结构上的相似性 和参考计数,我们开始重新检查各种收集器 架构,以了解这些样式之间的相互作用 收集我们观察到,所有现实的垃圾收集器都处于 事实是跟踪和引用计数的某种混合形式。这 解释了优化的“跟踪收集器”和优化的 “引用计数收集器”变得越来越相似:因为 事实上,它们正呈现出彼此的特点 他提到的一件事是使用ZCT(零计数表)来跟踪从堆栈引用的对象。 关于ARC,通常提到的另一件事是:C++ 如何使用C++;14内存模型的内部工作原理及其与Bacon';s统一的垃圾收集理论,c++,multithreading,garbage-collection,c++14,C++,Multithreading,Garbage Collection,C++14,读大卫·培根的 我发现他提到现代地面军事系统是追踪和参考计数的混合体: 考虑到我们发现的两种追踪方法在结构上的相似性 和参考计数,我们开始重新检查各种收集器 架构,以了解这些样式之间的相互作用 收集我们观察到,所有现实的垃圾收集器都处于 事实是跟踪和引用计数的某种混合形式。这 解释了优化的“跟踪收集器”和优化的 “引用计数收集器”变得越来越相似:因为 事实上,它们正呈现出彼此的特点 他提到的一件事是使用ZCT(零计数表)来跟踪从堆栈引用的对象。 关于ARC,通常提到的另一件事是: 它不是线程安全
最后但并非最不重要的一点是,如果我正在开发一个单线程应用程序,C++上的原子操作有增量/递减的优点是什么?无论如何,你可以禁用它吗?< /P> < p>你正在讨论垃圾收集器,在描述的属性和C++行为的比特之间找到一个类比,然后争论使C++成为垃圾收集语言。 这不是它的工作原理。GCs的这些属性并不是GC的充分定义,因此任何显示这些属性的东西都必须是GC
我们观察到,所有现实的垃圾收集器实际上都是某种形式的跟踪和引用计数的混合体 <关于现代C++ > 这是真的吗? C++没有垃圾收集器,所以这句话不适用于它
正如你所建议的,我们可以向后工作,并且说C++堆栈是它自己在上面描述的ZCT,因此提供了非常有限的跟踪形式。但这并不明显是有用的,因为它本质上是退化情况
类似地,RAII智能指针可以使用引用计数,因此我们可以认为我们既有跟踪也有弧。同样,这是否有用还不清楚 < P>还有,现代C++ C++对GC分配/分配的任何基准(注:我不是要求一般比较,而是针对内存管理)。< /P> 总的来说,这不是一个有意义的比较 C++能够以精细的粒度为每个资源(包括但不限于内存)选择正确的管理方案,完全控制布局、生存期、初始化、缓存效果等 如果你能费心去做所有这些,并且做得很好,你会在至少其中一些事情相关的程序中获得更好的性能 如果您不想费心去做这些事情,或者您的程序实际上没有受到它们的影响,那么您可以通过通用GC获得更好的性能,从而减少编程工作量 唯一知道的方法是基准测试,在您有意义地完成这项工作之前,您必须用不同的语言编写两次相同的程序,并确保每个实现都针对语言设施进行了良好的优化 单线程应用程序。。。作为原子操作的增量/减量 在这种情况下可能没有什么好处,除非您正在处理中断,并且需要它们和您的正常代码之间的一致性 在构建单线程应用程序时,您的平台是否实际发出了相关的围栏/屏障/锁定前缀/CA/等等,这是一个实现质量问题。只需查看汇编程序的输出即可 <现代C++(11/14/17)与这句话相比如何? 没有可比性。C++从来没有,也没有任何不再引用对象的自动垃圾收集。 <关于现代C++ > 这是真的吗? 不,不是真的。C++没有垃圾收集。< /P> 有些人认为C++没有GC, 这里没有争论。这是事实。在定义cu的1400多页技术规范中,您找不到任何类型的垃圾收集实现的描述