鉴于类对象的三个*略微*不同的副本,我如何有效地存储它们之间的差异?

时间:2011-02-02 04:55:02

标签: c++ class

直接问题:如果有三个(或更多)几乎相同的类对象副本,我怎样才能最好(或最有效)地存储它们之间的差异?

背景:我的算法需要一组参数:

struct params
{
   std::string A;
   std::string B;

   double C;
   double D;

   userDefinedTypeDef S;
};

我想调用我的算法三次。第一次,C = 3& S ='foo'。第二次,C = 4& S ='foo'。第三次,C = 4& S ='bar'。 现在给出的例子仅仅是为了说明,真正的对象是一个类,而不是一个结构,并且有几百个成员。我也想调用算法三次以上,所以我不想让这个对象的额外副本到处运行。那么,只存储两个类对象之间差异的最佳模式/实现/方法是什么?

换句话说,如何存储“对象2与&(对象1)相同,除了C = 4”??

编辑:如下面的评论中所述,我真的想避免更改函数调用以及参数类对象或成员对象的数组。我这样做的目的是保留一个副本,ala“currentParam”,然后保留连续调用之间的差异列表。这样,我可以简单地更新已更改的值,保留所有其他值,并使用给我的函数。

那说,最简单的方法是什么?使用布尔标志'member1_changed'创建一个类?然后使用联盟?我很困惑 - 对稀疏矩阵存储以及可能与之相关的问题感到困惑 - 因此我问了这个问题。

2 个答案:

答案 0 :(得分:4)

您可能会发现Flyweight design pattern很有意思。它专为解决您的问题而设计。

这是存储差异的一种方法:

步骤1:用指向成员的指针替换所有成员。是的,这增加了一点内存开销。

第2步:让类存储共享成员的浅拷贝,而不是深拷贝。

如果你的类不是不可变的,那么这种技术会变得更复杂,尽管基本的想法仍然可行。

请注意,这确实减少了内存占用,但也会减少内存引用的空间局部性。这可能会显着减慢您的程序。它还增加了一个额外的间接层。

答案 1 :(得分:1)

几百名会员?从一开始就对我说这听起来很糟糕。我甚至无法想到一个我能描述的需要这么多东西的物体。我可以想到一个系统。但公平地说,我并不批评你,因为我甚至不知道你是否最初写过这篇文章。我会研究一下我可以智能地将类拆分为子类甚至将数据分组为更好的表示的方法。这是第一次开始。

之后我还会考虑重写你的函数,使它只接受它所运行的参数:

void foo(Bar _objectWithTonsOfMembers){ //stuff...

void foo(int itemCount, double price, double discount, Customer customer){ //stuff

完成后,您可以考虑使用不同的参数处理请求。 Boost::Bind结合Boost::Function有助于完全处理这些类型的情况:

boost::function<void(int,double)> refinedFoo = boost::bind(foo, _1, _2, 4.09, Customer("Pam"));
refinedFoo(1, 3.0);
refinedFoo(2, 2.0);

现在我可以轻松调用我想要的函数,只有正在改变的参数。

修改

为了澄清我的“子类”,我不是指继承而是指结构。因此,我希望你把一些课“Foo”变成一个由Bar,Baz,Biff和Bam组成的课程。这些应该在代码中使用时分解为逻辑元素。

我的意思是,如果你有一个仅运行4个成员变量的函数,那些成员变量通常总是以相同的方式运行,那么这是创建新类或结构的好地方。 / p>