有效地在C ++类之间传输数据

时间:2010-05-03 08:18:40

标签: c++ oop object

需要帮助......

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

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

我的问题: 现在,类 A 会生成一个 B 类所需的浮点数向量。这个向量可以有超过1000个值,我不想使用剪贴板将它转移到 B ,因为它会成为时间消费者,甚至是瓶颈,因为这种行为会一步一步地重复。

简单的解决方案是 B 将知道 A (设置指向 A 的指针)。 另一种方法是通过 Manager 将指针传送到向量 但我正在寻找一些不同的,更面向对象的东西,它们不会破坏 A B 之间存在的分离

有什么想法吗?

非常感谢

大卫

6 个答案:

答案 0 :(得分:9)

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

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

有关“制作人消费者”和/或“队列”的更多信息,google(或搜索Stack Overflow),您可能会发现很多有用的信息

(例如Multithreaded Work Queue in C++

答案 1 :(得分:3)

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

如果B实现了一个通用接口,如IConsumer,管理器可以将此接口传递给A,A可以直接使用有效负载调用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);
}

答案 2 :(得分:1)

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

答案 3 :(得分:1)

弘(A.method());

答案 4 :(得分:0)

一旦您意识到class Aclass B都不应该用来管理共享数据存储,问题就解决了,因为它不是唯一的。因此,你应该假设Manager应该这样做。

为了获得最佳性能,请不要将指针传递给向量到A和B.而是传递原始float*,因为这样可以节省间接级别。折衷方案是通过boost::array &

答案 5 :(得分:0)

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