Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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++;14内存模型的内部工作原理及其与Bacon';s统一的垃圾收集理论_C++_Multithreading_Garbage Collection_C++14 - Fatal编程技术网

C++ 如何使用C++;14内存模型的内部工作原理及其与Bacon';s统一的垃圾收集理论

C++ 如何使用C++;14内存模型的内部工作原理及其与Bacon';s统一的垃圾收集理论,c++,multithreading,garbage-collection,c++14,C++,Multithreading,Garbage Collection,C++14,读大卫·培根的 我发现他提到现代地面军事系统是追踪和参考计数的混合体: 考虑到我们发现的两种追踪方法在结构上的相似性 和参考计数,我们开始重新检查各种收集器 架构,以了解这些样式之间的相互作用 收集我们观察到,所有现实的垃圾收集器都处于 事实是跟踪和引用计数的某种混合形式。这 解释了优化的“跟踪收集器”和优化的 “引用计数收集器”变得越来越相似:因为 事实上,它们正呈现出彼此的特点 他提到的一件事是使用ZCT(零计数表)来跟踪从堆栈引用的对象。 关于ARC,通常提到的另一件事是: 它不是线程安全

读大卫·培根的 我发现他提到现代地面军事系统是追踪和参考计数的混合体:

考虑到我们发现的两种追踪方法在结构上的相似性 和参考计数,我们开始重新检查各种收集器 架构,以了解这些样式之间的相互作用 收集我们观察到,所有现实的垃圾收集器都处于 事实是跟踪和引用计数的某种混合形式。这 解释了优化的“跟踪收集器”和优化的 “引用计数收集器”变得越来越相似:因为 事实上,它们正呈现出彼此的特点

他提到的一件事是使用ZCT(零计数表)来跟踪从堆栈引用的对象。 关于ARC,通常提到的另一件事是:

  • 它不是线程安全的,因为增量不是原子的
  • 如果它是线程安全的,那么它比GC慢
  • 我的问题是: 现代C++如何(11/14/17)与此语句相比较?C++的弧是混合的,也使用跟踪GC的一些元素吗?我在网上找不到任何东西能指出这一点,但该报非常明确地指出:

    我们观察到,所有现实的垃圾收集器都处于 事实是跟踪和引用计数的某种混合形式

    <现代C++是真的吗?还是没有考虑C++的“现实垃圾回收器”? 有人认为C++没有GC,C++没有跟踪GC,但是ARC是一种GC的方法,正如本文所述: 追踪和参考计数被一致视为 不同的垃圾收集方法 非常独特的性能特性。我们已经实施了 两种类型的高性能收集器,并在过程中观察到 我们越优化它们,它们的行为就越相似- 他们似乎有着共同的深层结构

    并且也出现在不同的其他来源上,比如维基百科 及

    引用计数是一种垃圾收集形式,每个对象 具有对它的引用数的计数。垃圾被识别 通过引用计数为零。对象的引用计数为 在创建对它的引用时递增,在 引用被销毁。当计数为零时,对象的 内存被回收

    < P>还有,现代C++ C++对GC分配/分配的任何基准(注:我不是要求一般比较,而是针对内存管理)。< /P>

    最后但并非最不重要的一点是,如果我正在开发一个单线程应用程序,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多页技术规范中,您找不到任何类型的垃圾收集实现的描述