首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据结构不变还是变量不变?

数据结构不变还是变量不变?
EN

Stack Overflow用户
提问于 2013-05-12 03:24:13
回答 1查看 227关注 0票数 1

在编写类时,无论是使用const关键字还是使用不可变类,始终都是一个大问题。

我来自Objective,当我使用Objective时,有一个分开的可变/不变的约定。这主要是因为缺少const语义,比如在C++中,但是它也保证了对象的不可变性,特别是当不可变对象被复制到可变对象时,我可以捕获。因此,我可以将共享状态用于不可变对象,并且只在将状态复制到可变对象时才复制状态。

在C++中,有const语义,所以我尝试用它设计一个容器,但是我有一些问题。这是示例代码。

代码语言:javascript
复制
struct Foo
{
  int bar;
};

Foo const f1;
Foo f2 = f1;    // This is allowed but...

允许从f1f2的复制分配,并且不会发出任何警告或错误。问题是,我不能将不可变对象复制到可变对象的情况。当我编写副本赋值构造函数时,它既适用于可变对象,也适用于不可变对象。我希望使不可变对象使用共享状态,并且只有在将其复制到可变对象时才会复制它。

我不适合抄写,因为我的容器代码应该适合实时程序.性能命中必须是可见的,位置应该是可预测的。抄写是不允许的,因为它将复制成本推迟到不可预测的时间点。复制成本必须可见。

这可以通过为每个不可变/可变对象创建分离的对象来解决,但我不确定这在C++上是否是好的设计。

什么是推荐的模式,使不可变/可变的类与可见复制成本?我认为,如果我可以从不可变到可变的复制构造函数,这是可以解决的,但我找不到任何方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-12 04:44:34

有指针:

代码语言:javascript
复制
const Foo *f1 = new Foo(); /* Foo instance is trapped in pointer-to-const */
//Foo *f2 = f1; /* Error; not allowed without cast. */
Foo *f3 = new Foo(*f1); /* Use copy constructor */
delete f1;
delete f3;

使用shared_ptr(C++11):

代码语言:javascript
复制
#include <memory>

std::shared_ptr<Foo> f1 = std::make_shared<Foo>(); /* shared_ptr will not implicitly copy object */
std::shared_ptr<Foo> f2 = f1; /* No copy made */
std::shared_ptr<Foo> f3 = std::make_shared<Foo>(*f1); /* use copy constructor */

如果客户端直接使用该对象,则它们将负责复制开销。这或多或少是意料之中的。您可以在类内部使用指针/refcounting/复制到写的方式来隐藏开销,但正如您所说的,这不是您想要的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16503883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档