您好我想知道是否有任何C ++标准允许编译器与对象“共享”数据。
IE
LinkedList a = std::share(myLinkedListObject);
在这种情况下,a
的数据与myLinkedListObject
相同,并且它们共享对内存的相同引用。在这种情况下,数据的所有权可以由shared_ptr
处理,也可以由原始对象处理(myLinkedListObj)
将保留所有权并控制数据的生命周期。
我承认直观的响应和解决方案只是使用指向适当对象的指针,但我正在为一组数据创建一个包装类,在这种情况下,包装类的字段是不同的,但数据本身是相同的
答案 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。