【问题标题】:High-performance decorator pattern for structured objects结构化对象的高性能装饰器模式
【发布时间】:2013-02-17 14:49:24
【问题描述】:

假设我有一个大数据结构,比如说一个巨大的vector,它的创建不在我的控制之下(即我不能修改它的静态类型),包含类InitialFunctionality 的对象。在 C++ 中:

class InitialFunctionality
{
 public:
 void iCanDoThis();
}

hugeVector vector<InitialFunctionality>; // <- lots of elements inside! :)

我的目标是动态地扩展hugeVectorInitialFunctionality 对象的功能,同时尽可能降低对性能的影响,比如说:

class ExtraFunctionality: public InitialFunctionality
{
 public:
 int iOfferThisToo;
}

众所周知的Decorator pattern 非常适用于非结构化对象。您可以使用它从InitialFunctionality 类中动态扩展对象的功能,然后愉快地传递它们。

但是如何在不改变其顺序且对性能影响最小的情况下扩展hugeVector 中的对象呢?例如,由于它的大小,复制向量是不行的。

我正在考虑对向量使用某种Adapter,它保留对原始hugeVector 的引用,并根据需要懒惰地转换包含的对象(即在访问适应的向量元素时)。然而,除了转换本身(即初始化iOfferThisToo),这是任何方法都需要的,这需要保留一个缓存来检查一个对象是否已经被转换。这样的缓存可能真的很昂贵。

【问题讨论】:

  • InitialFunctionality 在你的控制之下吗?
  • @AndyProwl 假设您的意思是InitialFunctionality 的定义:不,它不在我的控制之下。否则我可以在那里添加我的额外功能。这在设计方面可能被认为是丑陋的,但在性能方面会很好,这正是我所寻找的。​​span>

标签: c++ performance oop design-patterns decorator


【解决方案1】:

如果您不添加额外的成员,您应该可以执行以下操作:

class myInternalFunctionality : public InternalFunctionality {
public:
    //new features
    void ICanDoThis();

private:
    // disable all ctors
};

然后重铸指向向量中 InternalFunctionality 的指针。

myInternalFunctionality* myInternalPtr = &hugeVector[i];
myInternalPtr->ICanDoThis();

既然你是,我想你遇到了一些麻烦。

【讨论】:

  • 您能详细说明一下吗?对于初学者,我看不到InternalFunctionality 如何添加我的额外数据成员iOfferThisToo。假设没有隐含额外的转换,您的解决方案根本不正确(而且很危险!),因为没有分配给存在于myInternalFunctionality 中且不存在于InternalFunctionality 中的额外成员
  • 我没说这是个好主意,你也没说有额外的成员。类的存储基本上与结构相同,因此如果您想简单地添加方法,则可以使用。
  • 我确实说过有额外的成员,iOfferThisToo 在我的问题中的成员。请仔细阅读。另外,在添加虚拟方法时,您关于存储的说法也不正确。
猜你喜欢
  • 2012-05-14
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 2018-04-03
  • 2012-08-27
相关资源
最近更新 更多