【发布时间】:2015-10-10 11:23:25
【问题描述】:
我的生产者-消费者应用程序需要一个循环队列。就我而言,我有一个预先分配的对象数组(A 类):
A mylist[10];
查看 Boost 示例,似乎需要将项目“推入”和“弹出”到队列中/从队列中“弹出”。
但是,就我而言,我试图避免每次都创建一个新对象并将其推送到队列中,因为我可以简单地重用现有对象。
我的偏好是简单地更新当前生产者索引处的对象内容(并将索引更新到下一个位置)。同样,消费者使用当前消费者索引处的对象内容(并将索引更新到下一个位置)。本质上,它本身没有推送或弹出。
虽然我可以将自己的实现放在一起,但我想知道 STL 或 Boost 中是否已经有一些我可以使用的东西。
编辑:Boost 要求我每次将其推入队列时都创建一个新值。就我而言,我需要每秒添加 100 多个项目。内存分配会杀死我的应用程序。这是 boost 伪代码来说明我的问题:
class A {
public:
int x;
};
boost::circular_buffer<A*> list(10);
for(int i=0;i<10;i++) {
A* p = new A();
p->x = i;
list.push_back(p);
}
int val = 100;
while(true) {
// Set new values at the head of the queue
A* p = new A();
p->x = val; val++;
list.push_back(p);
}
如您所见,我只想重用队列中的对象,而不是创建新对象。
【问题讨论】:
-
没关系,你想要一个循环缓冲区。
-
我查看了 boost 循环缓冲区示例。我不知道。它仍然需要你“push_back”一个值。
-
@Peter: true - 确实如此 - 但是(使用 C++11 和当前的 boost)如果你推回一个临时的或用
std::move()包装的值,它会将它移动到缓冲区中,所以它不太可能特别昂贵。 (必须注意:通常最好让您的代码工作,然后查看它是否太慢;如果是这样,请使用分析器来确定要优化的内容。) -
我添加了一个伪示例来说明我的观点。内存分配会扼杀性能。非常感谢您的帮助。