据我所知,写时复制不是std::string
在C++ 11中实现符合性的可行方法,但最近在讨论中我发现自己无法直接支持该语句.
我是否正确C++ 11不承认基于COW的实现std::string
?
如果是这样,这个限制是否在新标准(其中)的某处明确说明了?
或者这个限制是否暗示,因为新要求的综合影响std::string
排除了基于COW的实施std::string
.在这种情况下,我会对"C++ 11有效禁止基于COW的std::string
实现" 的章节和样式推导感兴趣.
我想知道什么是copy-on-write是什么以及它用于什么?Sun JDK教程中多次提到术语"写时复制数组",但我不明白它的含义.
请问$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) 我知道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) 我想在我的自定义C++ String类上实现copy-on-write,我想知道如何...
我试图实现一些选项,但结果都非常低效.
感谢你们 :-)
我有一个包含源代码的目录,我编译它来生成目标文件.我想快速应用补丁并重建,以便我可以同时访问旧的和新的目标文件.一种方法是:
cd old && make
xcopy old new
cd new && apply diff && make
Run Code Online (Sandbox Code Playgroud)
但是,即使在同一驱动器上,副本也需要大约10分钟.如果我能new
成为一个写时复制版本old
会更快.Windows 7 NTFS可以创建写时复制目录吗?修改外部目录时,是否可以将这些目录扩展为写时复制子目录?
我们有一个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为代价......),那将是一个加分.
我清楚地记得从早期的.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) 当我尝试使用迭代器从CopyOnWriteArrayList中删除元素时,我收到异常.我注意到它已记录在案
不支持对迭代器本身进行元素更改操作(删除,设置和添加).这些方法抛出UnsupportedOperationException.
(来自http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html)
现在,令人惊讶的是我可以使用foreach迭代它并使用remove()函数.但后来我得到了着名的错误 - 当尝试使用for循环从列表中删除项目时 - 跳过被删除元素旁边的元素.那有什么建议吗?
我有什么方法可以避免修改副本的原位修改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) copy-on-write ×10
string ×4
c++ ×3
.net ×1
c++11 ×1
data.table ×1
immutability ×1
java ×1
matrix ×1
ntfs ×1
php ×1
r ×1
stdstring ×1
swift ×1
tostring ×1
value-type ×1
windows-7 ×1