在 C++ 中共享底层状态
Sharing underlying state in C++
您好,我想知道是否有任何 C++ 标准允许编译器 "share" 带有对象的数据。
IE
LinkedList a = std::share(myLinkedListObject);
在这种情况下,a
的数据与 myLinkedListObject
相同,并且它们共享相同的内存引用。在这种情况下,数据的所有权可以由 shared_ptr
或原始对象处理(myLinkedListObj)
将保留所有权并控制数据的生命周期。
我承认直观的响应和解决方案会简单地使用指向适当对象的指针,但我正在为一组数据创建一个包装器 class,在这种情况下,包装器的字段 class 是不同的,但数据本身是相同的。
C++ 没有内置任何内容来编纂您想要的语义,主要是因为不像 move 和 copy - 的完整行为源对象和目标对象的定义并不明确。例如,如果在 "share" 操作后修改源对象 a
会怎样?源列表是否也应反映您的修改?
如果是这样,那么您需要某种类型的参考。根据周围的代码和源对象的所有权,您可以使用普通引用或指针来实现,或者您可能需要使用某种类型的智能指针,如 shared_ptr
.
如果不是,那么您实际上是在谈论 copy 操作:源被复制到目标,但在那之后它们具有不同的状态。在这种情况下,共享底层状态仍然是可能的,但是对任一对象的任何 write 操作只需要修改写入的对象。这被称为 copy-on-write (COW),可用于在不影响复制语义的情况下以有效的方式实现某些操作。
您可以根据您的用例自行实现写时复制语义。例如,如果您有一个不可变对象的链表,可以想象共享操作可以简单地指向原始列表,并且任何突变都将仅调整必要的节点以确保仅写入列表在逻辑上被修改。
在您的具体情况下,您并不清楚您想要这些选项中的哪一个(如果有的话)。您提到要围绕某些 data
创建一个 wrapper
对象,其中 wrapper
对象的字段可能不同,但基础 data
将相同。这本身根本不需要任何技巧:您只需要一个具有字段的 wrapper
对象,然后共享的 data
字段必须是指针或引用 1 到具有适当生存期语义的数据对象(例如,shared_ptr
)。
1 一般来说,引用成员用处不大,指针(笨的或聪明的)通常应该 be preferred.
您好,我想知道是否有任何 C++ 标准允许编译器 "share" 带有对象的数据。
IE
LinkedList a = std::share(myLinkedListObject);
在这种情况下,a
的数据与 myLinkedListObject
相同,并且它们共享相同的内存引用。在这种情况下,数据的所有权可以由 shared_ptr
或原始对象处理(myLinkedListObj)
将保留所有权并控制数据的生命周期。
我承认直观的响应和解决方案会简单地使用指向适当对象的指针,但我正在为一组数据创建一个包装器 class,在这种情况下,包装器的字段 class 是不同的,但数据本身是相同的。
C++ 没有内置任何内容来编纂您想要的语义,主要是因为不像 move 和 copy - 的完整行为源对象和目标对象的定义并不明确。例如,如果在 "share" 操作后修改源对象 a
会怎样?源列表是否也应反映您的修改?
如果是这样,那么您需要某种类型的参考。根据周围的代码和源对象的所有权,您可以使用普通引用或指针来实现,或者您可能需要使用某种类型的智能指针,如 shared_ptr
.
如果不是,那么您实际上是在谈论 copy 操作:源被复制到目标,但在那之后它们具有不同的状态。在这种情况下,共享底层状态仍然是可能的,但是对任一对象的任何 write 操作只需要修改写入的对象。这被称为 copy-on-write (COW),可用于在不影响复制语义的情况下以有效的方式实现某些操作。
您可以根据您的用例自行实现写时复制语义。例如,如果您有一个不可变对象的链表,可以想象共享操作可以简单地指向原始列表,并且任何突变都将仅调整必要的节点以确保仅写入列表在逻辑上被修改。
在您的具体情况下,您并不清楚您想要这些选项中的哪一个(如果有的话)。您提到要围绕某些 data
创建一个 wrapper
对象,其中 wrapper
对象的字段可能不同,但基础 data
将相同。这本身根本不需要任何技巧:您只需要一个具有字段的 wrapper
对象,然后共享的 data
字段必须是指针或引用 1 到具有适当生存期语义的数据对象(例如,shared_ptr
)。
1 一般来说,引用成员用处不大,指针(笨的或聪明的)通常应该 be preferred.