我正在尝试将 vector (实际上是管理 vector 的对象)存储到队列中,以便稍后处理它们。
这是我当前的实现:
// in constructor:
q = new boost::lockfree::spsc_queue<MyObject>(num_elements_in_q);
// ...
bool Push(const MyObject& push_me) { return q->push(push_me); }
// ...
// in Pop() (i.e., this is how I pop stuff off of the queue)
MyObject temp;
q->pop(&temp);
我想知道存储指针而不是对象是否有意义。新代码如下所示:
// in constructor:
q = new boost::lockfree::spsc_queue<MyObject*>(num_elements_in_q);
// ...
bool Push(const MyObject& push_me) {
MyObject* ptr = new MyObject(push_me);
return q->push(push_me);
}
// ...
// in Pop() (i.e., this is how I pop stuff off of the queue)
MyObject* ptr;
q->pop(&ptr);
// do stuff with ptr
delete ptr;
就最小化推送操作所花费的时间而言,哪种方法最好?一般来说,最好是存储整个 MyObject 还是只存储指针(并动态分配内存)?我意识到通过存储整个 MyObject,仍然涉及动态内存,因为 MyObject 中的 vector 需要调整大小。
我的最终目标是以内存使用和 Pop() 执行所需的时间为代价(顶级版本需要Pop() 中的一个拷贝,通过使用指针来避免)。
感谢您的帮助。此外,我目前无法访问此系统上的分析器,否则我可能已经有了答案。
最佳答案
如果不实际测试,我会说使用 new 的内存分配比复制整个 MyObject 的成本更高。当然这取决于 MyObject 是如何实现的。
另一件需要考虑的事情是,假设 boost::lock_free 将数据存储在连续内存中,存储对象本身可能会给您带来更高的缓存命中率。因为你所有的对象都可以被 cpu 批量读取,因此一起存储在 L1 缓存中。使用指针将导致 CPU 从指针指向的内存中加载内容,并可能将队列中的其他元素踢出缓存。
当然,要 100% 确定您必须对其进行测量。
关于c++ - 优化速度 : Queue of Vectors vs. vector 指针队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28502517/