通用容器(如 Qt 容器中的容器)的共享内存/写时复制实现是否被 C++11 移动语义和右值引用取代?
一个失败而另一个成功的地方在哪里?或者它们是互补的而不是替代的?
写入时复制和移动语义都已用于优化在堆上保存数据的对象的值语义。std::string
例如,已实现为写时复制对象和支持移动的对象。
因此,写时复制和移动语义在这方面是相似的:如果您足够宽松地定义“复制”,则它们都可以用于优化“副本”。我有时将移动语义描述为写入时复制,引用计数限制为 0 或 1,因此包含引用计数的字段被优化掉。
std::lib 中的所有容器现在都使用移动语义,甚至std::string
以前允许使用写时复制,现在禁止这样做。如果我今天编写一个新的客户容器,我会在选择写时复制之前使用移动语义。
C++11 中仍然有写时复制的用途。如果您希望您的数据结构很少被写入,但经常被复制,并且许多客户端持有相同值的副本,那么写入时复制仍然是一个巨大的胜利。
例如,我已经看到写时复制很好地用于保存复杂文档的撤消列表。在任何给定的提交(您想要保存状态的位置)中,自上次提交以来只有大文档的一小部分发生了更改。因此,制作文档的副本以保存其状态意味着更新一堆引用计数,并实际上对一小部分进行更改(写入时复制样式)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)