【发布时间】:2017-10-15 16:40:21
【问题描述】:
是吗?
澄清:在std::vector 中,如果在迭代期间访问的元素当前不在缓存到内存中的页面上,则存在页面错误并且该页面已加载,但接下来的k-1 元素保证为缓存到内存中,其中k 是适合内存页面的元素数。
在我看来,在像std::unordered_set 这样的哈希表数据结构中,在迭代期间,根本无法保证对于访问的任何元素,后续元素将在内存中接近它的任何地方,这意味着在生成条件下大量元素,您可能会在迭代期间访问的每个元素都有潜在的页面错误。我错了吗?如果是这样,std::unordered_set 使用什么方法来防止这种情况发生?
只是好奇。我正在概述一个我计划现在实施的算法,并试图围绕它如何在有限的内存和退化条件下的许多元素以及我对 std::unordered_set 如何在引擎盖下工作的不完全了解是一个限制因素在这里。
【问题讨论】:
-
"
std::unordered_set使用什么方法来防止这种情况发生?" 一般不会尝试。在实践中,您必须非常不走运,或者您的机器内存非常不足,才能为每个元素获取页面错误。 -
实际上刚刚加载的带有
vector元素的页面可能会被卸载回页面文件,并且访问同一页面上的下一项将导致另一个页面错误。基本上大多数 C++ 应用程序只是通过将实际内存管理委托给系统来处理这个问题,假设使用语言方式分配的内存是可访问的。 -
为我定义不幸。假设我想破坏一个 unordered_set 并使其对于一些非常大的 n 个元素尽可能慢。有没有办法做到这一点(可能是像不断地随机插入和删除元素,插入的机会只有稍微高一点,直到我得到 n 个元素,或者通过删除大序列的连续元素等)还是只是一个概率完全独立于我对场景所做的事情?
-
提供一个自定义的
operator new,它实现了一个将分配分散到尽可能多的物理页面的堆。然后对系统施加沉重的内存压力以迫使其抖动。 -
"如果在迭代期间访问的元素当前不在缓存到内存中的页面上,则会出现页面错误" - 在某些架构上,但在其他架构上没有,它们没有页面或页面的概念故障。所以,C++ 没有解决这个问题。
标签: c++ c++11 unordered-set