Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.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++_Containers_Shared Memory_Rvalue Reference_Copy On Write - Fatal编程技术网

C++ 共享内存和写时复制或右值引用和移动语义?

C++ 共享内存和写时复制或右值引用和移动语义?,c++,containers,shared-memory,rvalue-reference,copy-on-write,C++,Containers,Shared Memory,Rvalue Reference,Copy On Write,通用容器(如Qt容器中的容器)的共享内存/写时拷贝实现是否已被C++11移动语义和右值引用所取代 一个失败,另一个成功?或者它们是互补的而不是替代的?写时复制和移动语义是完全不同的概念,每个概念都有不同的用途。虽然有一个常见的用例:从函数返回一个对象,在这种情况下,由于原始对象超出范围,因此实际上是一个移动,但在一般情况下,它们不同: 使用“写入时复制”,同时处于活动状态的多个对象可以共享内容。使用移动语义,只有一个对象在特定时间点具有内容 与此有点正交,写时拷贝在多线程环境中存在问题,因为可能

通用容器(如Qt容器中的容器)的共享内存/写时拷贝实现是否已被C++11移动语义和右值引用所取代


一个失败,另一个成功?或者它们是互补的而不是替代的?

写时复制和移动语义是完全不同的概念,每个概念都有不同的用途。虽然有一个常见的用例:从函数返回一个对象,在这种情况下,由于原始对象超出范围,因此实际上是一个移动,但在一般情况下,它们不同:

使用“写入时复制”,同时处于活动状态的多个对象可以共享内容。使用移动语义,只有一个对象在特定时间点具有内容


与此有点正交,写时拷贝在多线程环境中存在问题,因为可能有多个对象访问相同的数据(只读)和控制块(读/写),它需要以线程安全的方式进行管理。

写时复制语义和移动语义都被用于优化将数据保存在堆上的对象的值语义<例如,code>std::string,既作为写时拷贝对象实现,也作为移动启用对象实现

所以写时复制和移动语义在这方面是相似的:如果您对“复制”的定义足够宽松,那么它们都可以用来优化“复制”。我有时将移动语义描述为写时复制,引用计数限制为0或1,因此包含引用计数的字段被优化掉

std::lib中的所有容器现在都使用移动语义,甚至过去允许使用写时复制的
std::string
,现在也被禁止这样做。如果我现在正在编写一个新的客户容器,我会在选择copy on write之前使用移动语义

在C++11中,仍然可以使用写时复制。如果您希望您的数据结构很少被写入,而是经常被复制,并且许多客户机都持有相同值的副本,那么写时复制仍然是一个巨大的胜利


例如,我看到了一个很好的使用“写时拷贝”来保存一个复杂文档的撤销列表。在任何给定的提交(您希望保存状态的地方),自上次提交以来,大文档中只有一小部分发生了更改。因此,复制文档以保存其状态意味着更新一组引用计数,并实际对一小段进行更改(写入时复制样式)。

是否可以将写入时复制语义填充到例如分配器中?当然,在必要时修改接口函数以实际使用分配器。不过,我怀疑std::allocator是否具有所需的接口?目前我正在寻找容器的写时拷贝实现,因为它们用于多线程环境中,以避免长锁。在我的例子中,我有一个主容器和几个迭代器,它们必须能够安全地迭代其内容。用原子引用计数进行写上复制可以帮我完成这项工作。