【问题标题】:Designing a C++ class with with large members that are rarely accessed in copies?设计一个具有很少在副本中访问的大型成员的 C++ 类?
【发布时间】:2012-10-01 14:23:01
【问题描述】:

由于性能问题,我正在尝试重构一些 C++ 代码,我想知道解决这个问题的最佳方法。我有一个类说 DataGatherer,它是大型系统的核心组件。此类被序列化并通过数据流发送,复制并存储到表中,为了并发而复制(签出副本而不是访问原始 DataGatherer 对象)。我列出示例只是为了让您知道它具有同时使用的复制和赋值运算符。

问题在于 DataGatherer 对象可能会变得非常大,因为它们本质上包含大量收集的数据以及有关数据的统计信息和元数据。在许多情况下,只需要统计数据和元数据,而不是后端数据收集。

这里有什么设计模式可能有用吗?也许更普遍的问题是,在大多数情况下您只需要一个对象的一部分,但该对象内部耦合如此紧密以至于几乎不可能将其拆分时,您会怎么做?

我的想法,

  • 将该类拆分为一个 DataGatherer 类和一个指向 DataGathererBackend 对象的指针。在大多数情况下返回浅副本以避免在不使用 DataGathererBackend 时复制它的所有开销。我讨厌这样做,因为当你想要一个浅拷贝和你想要一个深拷贝时处理所有的麻烦,而且只是一般的混乱形式不得不求助于后端对象具有 NULL 指针的 DataGatherer 对象,因为它不是在这些情况下需要。

  • 将类拆分为 DataStatistics 和 Data,并创建一个包装并包含两者的第三个类。

  • 其他想法?

【问题讨论】:

  • 创建作为接口实现的对象“视图”怎么样?这些接口只能作为工厂的前端。

标签: c++ oop design-patterns architecture software-design


【解决方案1】:

如果只需要统计数据,那么您可以通过值或常量引用返回一个统计数据结构,并将检索从复制运算符更改为调用统计数据 getter 函数。

【讨论】:

    【解决方案2】:

    一个选项是您可以执行 Copy On Write,其中复制构造函数或赋值运算符被重载以首先不复制(后端?)数据,对其进行引用计数,并仅在修改数据时复制它。您可以在 DataGatherer 内部执行此操作,因此 iterface 不会更改,只要您可以重载数据修改成员即可。但是如果你已经暴露了指向数据的指针并在任何地方使用它,那就更难了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 2021-06-06
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多