在C ++中共享基础状态

时间:2017-07-24 03:45:03

标签: c++ optimization shared-ptr shared-memory move-semantics

您好我想知道是否有任何C ++标准允许编译器与对象“共享”数据。

IE

LinkedList a = std::share(myLinkedListObject); 

在这种情况下,a的数据与myLinkedListObject相同,并且它们共享对内存的相同引用。在这种情况下,数据的所有权可以由shared_ptr处理,也可以由原始对象处理(myLinkedListObj)将保留所有权并控制数据的生命周期。

我承认直观的响应和解决方案只是使用指向适当对象的指针,但我正在为一组数据创建一个包装类,在这种情况下,包装类的字段是不同的,但数据本身是相同的

1 个答案:

答案 0 :(得分:1)

C ++中没有任何内置编码所需的语义,主要是因为与 move copy 不同 - 源和目标对象的完整行为不是非常明确。例如,如果在“共享”操作后修改源对象a,该怎么办?源列表是否也反映了您的修改?

如果是这样,那么你想要某种类型的参考。根据周围的代码和源对象的所有权,您可以使用普通引用或指针来实现它,或者您可能需要使用某种类型的智能指针,如shared_ptr

如果没有,那么您实际上是在谈论 copy 操作:将源复制到目标,但在该点之后它们具有不同的状态。在这种情况下,仍然可以共享基础状态,但对任一对象的任何 write 操作都只需要修改写入的对象。这被称为copy-on-write (COW),可用于以有效的方式实现某些操作,而不会影响复制语义。

您可以根据自己的使用情况自行实现写时复制语义。例如,如果你有一个不可变对象的链表,那么共享操作可以简单地指向原始列表,任何突变都只会调整必要的节点,以确保只对逻辑上的书面列表进行修改。

在您的具体情况下,您不清楚您想要哪些选项(如果有的话)。您提到要围绕某些wrapper创建data对象,其中wrapper对象的字段可能不同,但基础data将相同。这根本不需要任何技巧:你只有一个wrapper对象有字段,然后共享的data字段必须是指针或引用 1 具有适当的生命周期语义的数据对象(例如,shared_ptr)。

1 一般来说,参考成员不是太有用,指针(哑或聪明)一般应be preferred