【问题标题】:Is there any Tables lib/code for in memory manipulation in C++ [closed]在 C++ 中是否有任何用于内存操作的表库/代码 [关闭]
【发布时间】:2011-03-09 13:05:14
【问题描述】:

我已经开始编写自己的“数组结构”编码,但想知道是否有人知道已经存在用于在内存受限的硬件上进行密集数据转换的库或模板。

我想我正在寻找的是一种“内存中”容器,它允许我将插入排队直到一个同步点,并在迭代中“删除”。它不必是实际的删除(带有移动东西的开销),标记为已删除也可以。 此外,为了缓存预热等性能,容器可能在很大程度上必须是连续的。连续块而不是完全连续块也可以,但是基于链表的容器不会因为内存或速度而减少它,因为数组通常由非常小的元素组成。

这就是我假设某种表格类适合的原因,因为容器就像一个按主键排序的表格。

虽然意思很好,但使用 std::vector 的想法实际上是不可能的,因为在迭代期间删除某些内容会因为访问数组末尾和开头(计数)而弄乱缓存。

此外,没有理由不能在同一数据上运行多个迭代器,因此将交换作为删除操作会导致其他迭代器跳过某些元素。这就是我提到排队插入的原因。

插入和删除改变了容器的形状,所以我假设它们可以通过同步操作来处理,但是插入删除的动作可以在当前内容的迭代过程中排队。

【问题讨论】:

  • “会弄乱缓存”->您是否真的对此进行了分析并测量了显着影响?
  • 如果你不按顺序处理它,它需要大约 500 个周期才能加载到数组的末尾,你必须查找它与前面的距离(通过获取当前大小向量),即使你实际上没有交换,那也是一开始的写命中,你仍然必须写新的大小。如果您保持“缓存”大小,那么您将同时停止多个迭代器的工作。

标签: c++ performance templates data-oriented-design


【解决方案1】:

和中间迭代“删除”。它不一定是真正的删除

您可以使用std::vector,但不是在中间擦除,您只需与最后一个元素交换然后擦除它:

#include <algorithm>

template <typename T>
void cheap_erase(std::vector<T>& vec, size_t index)
{
    using std::swap;
    swap(vec[index], vec.back());
    vec.pop_back();
}

【讨论】:

  • 这可能是swap(vec[index], vec.back()); vec.pop_back(); 以避免与迭代器混淆。
猜你喜欢
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多