【问题标题】:Transfer data between C++ classes efficiently高效地在 C++ 类之间传输数据
【发布时间】:2011-02-14 22:59:49
【问题描述】:

需要帮助...

我有 3 个类,Manager 包含 2 个指针。一个到 A 类,另一个到 B 类。 A 不知道 B,反之亦然。

A 进行一些计算,最后将 3 个浮点数放入剪贴板。 接下来,B 从剪贴板中提取 3 个浮点数,并进行自己的计算。 此循环由 Manager 管理并重复多次(迭代后迭代)。

我的问题: 现在类 A 生成类 B 需要的浮点向量。这个向量可以有超过 1000 个值,我不想使用剪贴板将其传输到 B,因为它将成为时间消耗,甚至是瓶颈,因为这种行为会逐步重复。 p>

简单的解决方案是B会知道A(设置一个指向A的指针)。 另一种是通过Manager传递一个指向vector的指针 但我正在寻找不同的、更面向对象的东西,不会破坏 AB

之间现有的分离

有什么想法吗?

非常感谢

大卫

【问题讨论】:

    标签: c++ oop object


    【解决方案1】:

    正如已经指出的,您可以只使用std::vector<float> 作为共享存储,只要AB 不在不同的线程中运行。 Manager 可以管理这个存储。当A 开始工作时,它可以从该向量请求一个范围来存储它的结果。完成后,Manager 调用B 并将刚刚用A 填充的范围交给它。这样可以避免任何复制。

    【讨论】:

      【解决方案2】:

      一旦您意识到class Aclass B 都不应该累于管理共享数据存储,问题就解决了,因为它不是任何一方独有的。因此,您认为Manager 应该这样做是正确的。

      为了获得最佳性能,不要将指针指向向量 传递给A 和B。而是传递一个原始float*,因为这样可以节省一定程度的间接性。妥协是通过boost::array &

      【讨论】:

        【解决方案3】:

        clipboard is a crazy way 在两个实体之间传输数据。

        如果B实现了IConsumer等通用接口,管理器可以将此接口传递给A,A可以直接用payload调用B的方法:

        class IConsumer {
        public:
           virtual void consume(const vector<float>& data) = 0;
        };
        
        class B: public IConsumer {
        public:
           virtual void consume(const vector<float>& data) { ... }
           ...
        };
        
        class A {
        public:
           virtual void produce(IConsumer& consumer) {
              vector<float> data;
              ...
              consumer.consume(data); 
           }
           ...
        };
        
        void Manager::tick() {
           a->produce(*b);
        }
        

        【讨论】:

          【解决方案4】:

          听起来你正在编写一个生产者/消费者对,他们可以通过浮动的(可能是线程安全的)队列更轻松地进行通信。

          换句话说:“队列”就像您当前使用的向量。 A 和 B 都将引用此队列。 A 运行计算,并将浮点数写入队列(一次可能三个,如果你需要的话)。 B 检查队列,或者可能由 A“发出信号”表明队列已准备就绪,并从队列中抓取浮点数进行处理。

          更多信息,谷歌(或搜索堆栈溢出)“生产者消费者”和/或“队列”,你可能会发现很多有用的信息.

          (例如Multithreaded Work Queue in C++

          【讨论】:

          • 谢谢。这就是我今天使用“剪贴板”所做的事情。现在的问题是我需要传输一个大约 1000 个值的向量。将这些值写入剪贴板并将它们读回非常耗时,因为我的应用程序是具有许多计算的数学应用程序,并且它与 CPU 相邻,这意味着我需要节省 CPU 时间来计算而不是将数据传入/传出队列..
          • 您不需要将数据传入和传出队列,就其本身而言。您可以直接使用队列中的数据。如果性能很重要,您是否分析过代码以查看瓶颈?因为“与 CPU 相邻”对我来说意味着“尝试直接从缓存中工作”,这可能会非常困难,尤其是如果您还使用异构的、可能是多核的硬件。
          • 由于 A 和 B 交错运行,线程安全队列的开销似乎放错了位置。当然,在单独的线程上运行 A 和 B 可能是一种有效的改进(如果这两种计算都比跨线程同步昂贵得多)
          • 因此在我的原始答案中使用“可能” - 如果生产者和消费者确实很容易以单线程方式同步,则队列不需要是线程安全的。但是,由于问题中提到了“性能”,因此多线程 A 和 B 可能很快就会出现。
          【解决方案5】:

          B.method(A.method());

          【讨论】:

            【解决方案6】:

            创建一个向量,并在迭代中使用“按引用传递”将其传递给 A 和 B。

            【讨论】:

              猜你喜欢
              • 2021-12-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-09-20
              • 1970-01-01
              • 1970-01-01
              • 2017-02-25
              • 2016-08-04
              相关资源
              最近更新 更多