问题标签 [copy-on-write]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby - ruby 中的变量引用
显然,ruby 似乎是一种传递参考语言:
即,构造数组和块似乎都处理对原始类实例变量对象的引用。
但是,一旦我尝试写入这些引用,它们似乎就会创建副本:
我有一些类实例变量对象,我需要通过一个函数进行转换,所以我想我可以通过使用传递引用的东西来保存击键,并执行以下操作:
但由于似乎正在发生这种写时复制的事情,它似乎不起作用。
有没有办法关掉它?您将如何在保持代码干燥和高效的同时完成我的工作?
java - ListIterator 可以安全地替代 Iterator 吗?(实现 List 的 CopyOnWrite 包装器)
我在代码中有很多实例,其中集合,通常是从方法返回的列表,并且考虑到调用者可能会更改该列表,因此制作了防御性副本。
JDK 似乎没有为此目的提供包装器,所以我试图推出自己的包装器(注意:java.util.concurrent.CopyOnWriteArrayList不是我在这里寻找的)。
从原理上讲,我正在尝试的是:
对于大多数 API,这很简单,但是查看 java.util.ArrayList 我发现,对于方法 iterator(),它返回与 listIterator() 不同的实现,尽管 ListIterator 扩展了它的 Iterator,但它没有添加任何新成员。
我想知道这背后是否有更深层次的原因 - 我计划简单地实现 iterator() 和 listIterator() 都返回相同类型的迭代器 - ListIterator。为什么不应该从 iterator() 方法返回 ListIterator 是否有任何合乎逻辑的理由?
java - Java - 多线程写时复制
是否可以为 Java 中的多线程应用程序添加软件强制写入时复制?我的意思是线程具有对同一对象的引用,但是当一个线程尝试修改它时,所指向的对象被复制并且引用被调整为指向该副本。
objective-c - Objective-C 中的 Copy-on-write-if-leaked 习语
我有一种情况,我必须生成一系列对象,然后一次将它们传递回应用程序(想想基于块的或快速枚举)。
但是,每个对象的生成成本都会相对较高,因此我正在寻找避免这种成本的方法。
碰巧是这样,给定序列的一个对象,下一个对象可以通过对前者的简单修改来有效地生成。出于这个原因,很容易“作弊”,只创建一个对象,然后不断将同一个对象传递回应用程序,并且只在序列的每一步“幕后”进行“廉价”修改.
当然,问题是应用程序可能会选择(并且应该允许)在其他地方存储对某些或所有对象的引用。如果这样做,那么真正的独特对象序列的“幻觉”就会崩溃。
如果 Objective-C 允许,解决这个问题的一种巧妙方法是检测应用程序何时确实在其他地方存储引用,并且无论何时发生这种情况,在应用生成下一个元素的修改之前,用它自己的副本替换对象在序列中。
我不知道这个成语的正式名称是什么,但我们可以称之为“copy on write if leaked”、“copy on write if shared”,或者简称为“copy on write”。
我的问题是:启用 ARC 的 Objective-C 是否允许实现这样的习语?
而且,在 Objective-C 中解决这类问题是否是正确的方法?
我确实注意到启用 ARC 后,我无法从对象中提取引用计数,也无法覆盖增加和减少它的方法。
编辑:我注意到有一个copy
属性可以应用于属性,但我很难弄清楚。你们中的任何人都能够解释它是如何工作的吗?
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#property-declarations
python - NumPy 数组写时复制
我有一个返回大型 NumPy 数组的类。这些数组缓存在类中。我希望返回的数组是写时复制数组。如果调用者最终只是从数组中读取,则不会进行任何复制。这将不会使用额外的内存。但是,数组是“可修改的”,但不会修改内部缓存的数组。
我目前的解决方案是将任何缓存数组设置为只读(a.flags.writeable = False)
。这意味着如果函数的调用者想要修改数组,他们可能必须制作自己的数组副本。当然,如果源不是来自缓存并且数组已经是可写的,那么他们会不必要地复制数据。
所以,最好我会喜欢类似的东西a.view(flag=copy_on_write)
。似乎有一个与之相反的标志,UPDATEIFCOPY
这会导致副本在释放后更新原始副本。
谢谢!
php - Why are PHP references a bad idea? How do zvals and Copy On Write come into it?
I've recently discovered that using references in PHP is generally (although not always) a bad idea from a memory management or performance point of view, because of Copy On Write and the way that variables are represented under the hood using zvals.
Can someone offer a fuller explanation? I have seen this link posted a few times on Stack Overflow: http://schlueters.de/blog/archives/125-Do-not-use-PHP-references.html
I also found this reference, which goes into a bit more detail about zvals and how they work. It's in French though, although Google does a pretty good job of translating it: http://julien-pauli.developpez.com/tutoriels/php/internals/variables/
I'm surprised there isn't any more, or better documentation on this, and I wondered if any other Stack Overflow users have come across any clearer or more accessible documentation that I haven't been able to find?
c - 释放未更改的“写时复制”内存
我明白写时复制背后的想法。当我 fork 时,堆被标记为 CoW,并且当任何进程试图更改它时,都会制作一个副本。问题是:我是否必须在孩子的过程中释放它?假设一个父级有一个动态的 char *array,那么它会分叉。一个子进程打印一些 const char,然后退出。子进程根本没有改变堆。会不会有内存泄漏?
编辑:我的子进程在堆上打印数组,但不修改它。Valgrind 说如果我不释放那个数组就会有泄漏。释放它时没有泄漏/内存错误。
c - fork 系统调用:父级预分配的内存是否会再次分配给子级?
如果我运行这个程序并在顶部观看相同的内容,我会看到分配给父级和子级的 40MB 内存。
但是在后台我希望写入时的副本可以防止内存的双重分配,因为我还没有触及它..
注释?COW 是否特定于某些平台?如何测试 COW 是否确实是 fork 的方式?
javascript - JavaScript 和大字符串,JavaScript 是否使用写时复制?
我想知道(希望确认一下)JavaScript 是否以写时复制的方式管理其变量。这很重要,因为我最终可能会处理可能很大的字符串,其中不少。
是b
深拷贝还是写时拷贝?我的代码将从写时复制中受益匪浅,因为在某些情况下我设置b
为不同的值(即在大多数情况下我复制a
,在其他情况下我设置为,例如,"on"
或"off"
。但是,它没有得到稍后修改。)
c++ - 深拷贝的分段错误
我正在尝试对对象进行深层复制(用于写入时复制),但出现分段错误。
我正在使用带有链表的哈希表。
我的班级哈希表的属性:
编辑:这个问题似乎是固定的。 我的深层副本有什么问题?我不明白。我认为我的复制构造函数很好,但我不明白为什么在运行它时会出现段错误。