标签: copy-on-write

C++ 11中COW std :: string实现的合法性

据我所知,写时复制不是std::string在C++ 11中实现符合性的可行方法,但最近在讨论中我发现自己无法直接支持该语句.

我是否正确C++ 11不承认基于COW的实现std::string

如果是这样,这个限制是否在新标准(其中)的某处明确说明了?

或者这个限制是否暗示,因为新要求的综合影响std::string排除了基于COW的实施std::string.在这种情况下,我会对"C++ 11有效禁止基于COW的std::string实现" 的章节和样式推导感兴趣.

c++ string stdstring copy-on-write c++11

114
推荐指数
5
解决办法
2万
查看次数

什么是写时复制?

我想知道什么是copy-on-write是什么以及它用于什么?Sun JDK教程中多次提到术语"写时复制数组",但我不明白它的含义.

copy-on-write data-structures

108
推荐指数
5
解决办法
8万
查看次数

(字符串)'硬拷贝'字符串?

PHP使用修改后复制系统.

请问$a = (string) $a;($ a是已经串)修改和复制任何东西?


特别是,这是我的问题:

参数1是mixed/我想允许传递非字符串并将它们转换为字符串.
但有时这些字符串非常大.所以我想省略复制param,这已经是一个字符串了.

我可以使用版本Foo还是必须使用版本Bar

class Foo {
    private $_foo;
    public function __construct($foo) {
        $this->_foo = (string) $foo;
    }
}

class Bar {
    private $_bar;
    public function __construct($bar) {
        if (is_string($bar)) {
            $this->_bar = $bar;
        } else {
            $this->_bar = (string) $bar;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

php string copy-on-write

27
推荐指数
3
解决办法
8506
查看次数

是否快速复制所有结构的写入?

我知道swift会优化复制写入数组,但它会为所有结构执行此操作吗?例如:

struct Point {
   var x:Float = 0
}

var p1 = Point()
var p2 = p1 //p1 and p2 share the same data under the hood
p2.x += 1 //p2 now has its own copy of the data
Run Code Online (Sandbox Code Playgroud)

value-type copy-on-write swift

23
推荐指数
2
解决办法
4298
查看次数

如何实现Copy-on-Write?

我想在我的自定义C++ String类上实现copy-on-write,我想知道如何...

我试图实现一些选项,但结果都非常低效.

感谢你们 :-)

c++ string copy-on-write

18
推荐指数
2
解决办法
2万
查看次数

使用NTFS在Windows 7上创建写时复制目录

我有一个包含源代码的目录,我编译它来生成目标文件.我想快速应用补丁并重建,以便我可以同时访问旧的和新的目标文件.一种方法是:

cd old && make
xcopy old new
cd new && apply diff && make
Run Code Online (Sandbox Code Playgroud)

但是,即使在同一驱动器上,副本也需要大约10分钟.如果我能new成为一个写时复制版本old会更快.Windows 7 NTFS可以创建写时复制目录吗?修改外部目录时,是否可以将这些目录扩展为写时复制子目录?

ntfs copy-on-write windows-7

18
推荐指数
1
解决办法
2488
查看次数

在C++中使用哪些字符串类?

我们有一个C++(MFC)的多线程桌面应用程序.目前开发人员使用CString或std :: string,可能取决于他们的心情.所以我们想选择一个实现(可能不是那两个).

MFC的CString基于写时复制(COW)习惯,有些人会声称这在多线程环境中是不可接受的(并且可能参考了这篇文章).我不相信这样的说法,因为原子计数器看起来非常快,并且这种开销在某种程度上可以通过减少内存重新分配来弥补.

我了解到std :: string实现依赖于编译器 - 它在MSVC中不是COW,但它是,或者是在gcc中.据我所知,新的C++ 0x标准将通过要求非COW实现并解决一些其他问题(例如连续的缓冲区要求)来解决这个问题.所以实际上std :: string看起来没有明确定义......

我不喜欢std :: string的一个简单示例:没有办法从函数返回一个字符串而没有过多的重新分配(复制构造函数如果按值返回,并且没有访问内部缓冲区来优化那么"返回通过引用"例如std::string& Result没有帮助".我可以使用CString执行此操作,方法是返回值(由于COW没有复制)或通过引用传递并直接访问缓冲区.再次,C++ 0x使用其右值引用进行救援,但我们不会在最近的特征中使用C++ 0x.

我们应该使用哪个字符串类?COW真的可以成为一个问题吗?是否有其他常用的字符串高效实现?谢谢.

编辑:我们目前不使用unicode,我们不太可能需要它.但是,如果有一些容易支持unicode的东西(不是以ICU为代价......),那将是一个加分.

c++ string multithreading copy-on-write

17
推荐指数
2
解决办法
2661
查看次数

StringBuilder在调用ToString后变得不可变吗?

我清楚地记得从早期的.NET开始,在StringBuilder上调用ToString用于提供新的字符串对象(要返回)与StringBuilder使用的内部char缓冲区.这样,如果使用StringBuilder构造了一个巨大的字符串,则调用ToString不必复制它.

在这样做时,StringBuilder必须阻止对缓冲区的任何其他更改,因为它现在由不可变字符串使用.因此,StringBuilder将切换到"复制更改",其中任何尝试的更改将首先创建新缓冲区,将旧缓冲区的内容复制到它,然后才更改它.

我认为假设StringBuilder将用于构造一个字符串,然后转换为常规字符串并丢弃.对我来说似乎是一个合理的假设.

现在就是这个.我在文档中找不到任何提及.但我不确定它是否有记录.

所以我使用Reflector(.NET 4.0)查看了ToString的实现,在我看来它实际上是复制字符串,而不是仅仅共享缓冲区:

[SecuritySafeCritical]
public override unsafe string ToString()
{
    string str = string.FastAllocateString(this.Length);
    StringBuilder chunkPrevious = this;
    fixed (char* str2 = ((char*) str))
    {
        char* chPtr = str2;
        do
        {
            if (chunkPrevious.m_ChunkLength > 0)
            {
                char[] chunkChars = chunkPrevious.m_ChunkChars;
                int chunkOffset = chunkPrevious.m_ChunkOffset;
                int chunkLength = chunkPrevious.m_ChunkLength;
                if ((((ulong) (chunkLength + chunkOffset)) > str.Length) ||     (chunkLength > chunkChars.Length))
                {
                    throw new ArgumentOutOfRangeException("chunkLength",     Environment.GetResourceString("ArgumentOutOfRange_Index"));
                }
                fixed (char* chRef = chunkChars)
                {
                    string.wstrcpy(chPtr + chunkOffset, chRef, chunkLength);
                } …
Run Code Online (Sandbox Code Playgroud)

.net stringbuilder tostring immutability copy-on-write

15
推荐指数
2
解决办法
1921
查看次数

从CopyOnWriteArrayList中删除元素

当我尝试使用迭代器从CopyOnWriteArrayList中删除元素时,我收到异常.我注意到它已记录在案

不支持对迭代器本身进行元素更改操作(删除,设置和添加).这些方法抛出UnsupportedOperationException.

(来自http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html)

现在,令人惊讶的是我可以使用foreach迭代它并使用remove()函数.但后来我得到了着名的错误 - 当尝试使用for循环从列表中删除项目时 - 跳过被删除元素旁边的元素.那有什么建议吗?

java copy-on-write

13
推荐指数
3
解决办法
2万
查看次数

在R中修改矩阵

我有什么方法可以避免修改副本的原位修改R

我试图将较小的矩阵复制到一个较大的矩阵切片,如下所示.

library(data.table)
y <- matrix(c(11,21,31,12,22,32),nrow=3,ncol=2)
address(y)
[1] "08429190"

y[2:3,] <- matrix(c(1,1,8,12),nrow=2)
address(y)
[1] "0E033D28"
Run Code Online (Sandbox Code Playgroud)

r matrix copy-on-write data.table

13
推荐指数
1
解决办法
904
查看次数