问题标签 [memory-pool]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
134 浏览

java - 哪个更快:数组列表或循环遍历所有数据组合?

我正在用 Java 编写一些东西,有关上下文,请参阅这个问题:Java 中的马尔可夫模型决策过程

我有两个选择:

或 ArrayList mypatterns

我可以在创建数组时使用 Java ArrayList 并附加一个新数组,或者通过计算所有可能的数据组合来使用静态数组,然后循环查看哪些索引是“打开或关闭”的。

本质上,我想知道是否应该分配一个可能包含未初始化值的大块,或者使用动态数组。

我以 fps 运行,因此每帧循环 200 个元素可能会非常慢,特别是因为我将有多个此循环实例。

根据理论和我所听到的,动态数组非常低效

我的问题是:循环遍历一个包含 200 个元素的数组会比将对象附加到动态数组更快吗?

编辑>>>

更多信息:

  • 我会知道数组的最大长度,如果它是静态的。
  • 数组中的项目会经常更改,但它们的大小是恒定的,因此我可以轻松更改它们。
  • 静态分配它就像一个内存池
  • 其他实例的初始化数据可能比其他实例多或少
0 投票
0 回答
68 浏览

c++ - 如果分配器的 deallocate() 是 noop,是否可以使用 STL 容器而不被破坏?

抱歉标题太长了~

deallocate()我在一个空的内存池之上实现了一个简单的分配器。如果 STL 容器与此分配器一起使用,并且容器的元素很容易被破坏,我可以完全避免调用容器的析构函数吗?

标准可能说不,但我不确定。IMO,如果允许这种行为,STL 容器除了从其分配器分配的内存之外,无法获得任何资源,这将过多地限制 STL 供应商。我从来都不是标准方面的专家,我很高兴被证明是错误的。

但是,如果我的简单分配器与 libstdc++ 或 libc++ 等一些实际实现一起使用,程序会泄漏内存或遇到其他问题吗?

0 投票
3 回答
1046 浏览

c - C memcpy 导致分段错误

所以我试图实现一个简单的内存池作为大学作业的一部分,但是我遇到了在我分配的内存中存储值的麻烦。

这是我的 main.c 文件:

我的 Pool.h 文件:

还有我的 Pool.c 文件:

每当我调用包含调用 memcpy 的行的“store_in_pool”时,就会出现问题。我不确定问题是什么,因为我确定我将正确的值传递给函数但是每次尝试运行程序时都会发生分段错误。

问题的原因可能是什么?

0 投票
1 回答
78 浏览

c++ - 如何为多线程向量 (LFSV) 创建适当的内存池?

以下是我的大学不再教授的课程的旧练习(并行处理)。目标是创建和使用内存库来加速无锁排序向量的实现。我自己实现了内存库,目标是留出足够的内存来使用,这样我就不必在 LFSV 中使用 new 或 delete。我相信我需要一个 Get() 函数来返回内存的地址(不确定如何跟踪未使用的内存)并且 Store 应该释放内存(以某种方式将其标记为未使用)。

在 LFSV 内部(在我干预之前它工作得非常好),练习解释说我应该用新的替换和存储(我们想要释放的内存)替换新的和删除的。如何创建 Get(如果这不正确)或 Store 函数以像正确的内存库一样执行?我还将在线获取您可能知道的任何参考或内存库示例,因为我无法找到与内存库和多线程相关的良好资源。

该程序没有错误,但由于我没有正确管理内存库,它返回“失败”。

0 投票
1 回答
116 浏览

memory-management - 在不调整数组大小的情况下填充任意大小的向量的惯用方法?

有时您想在不提前知道需要多少数据的情况下分配数据。

大多数向量都可以按原样进行,但有时分配内存块链并根据需要创建新块更有效。

如果您不需要通过索引直接访问它们(例如仅弹出最后一项),则可以将它们保存为内存块。否则,一旦完成,就可以分配一个固定大小的向量并将数据复制到其中。

虽然这可以在 Rust 中使用LinkedListof来完成Vec,但是否有更惯用的方式来执行此任务?

0 投票
0 回答
131 浏览

c++ - 如何将内存池概念集成到数据结构中(例如自定义数组)?

我一直在使用组件实体系统。
很久以前,我想改进它以使用内存池

阶段1

为简单起见,这是我的古老代码:-

这是重构的结果:-

它真的很好用。(每个时间步使用的时间-=10%)

阶段2

现在我有强烈的愿望在任何地方都适应内存池的概念。
但是,在涉及一些数据结构的情况下,这很难。

这是一个示例函数,它返回某个实体的所有(默认)物理体。
它不是真正完整的代码,但足以显示有问题的部分:-

MyArray<T>是一个类似于 的自定义数组std::vector。它使用自己的分配器。

这是它的核心:-

因此,每当我调用MyArray<PhysicObject*>::operator=(),
... 粗略地说,operator new[]都会被调用。( #problem)

记忆再次碎片化。

问题

通用数据结构应该使用内存池概念吗?
如果是这样,如何专业地将内存池概念集成到数据结构中?

我只是想要一个粗略的想法。
完全不包含代码的解决方案是可以接受的。

更多技术信息

有两种类型的问题MyArray<T>:-

  1. MyArray<T>作为 Component 的一个字段(例如Com_Physic)。
  2. MyArray<T>作为从一个系统传递到另一个系统的临时消息。它创建快,删除快。(>70% , 寿命 = 1 个时间步长)

我有一个想法将它分为两​​种情况,ShortLife_MyArray<T>& LongLife_MyArray<T>,
...但我认为我让它太复杂且难以维护。

更糟糕的是,在真正的游戏中,除了 之外,还有很多种数据结构MyArray<T>,例如MyArray<T1,T2>MyMap<T1,T2>MySet<T1,&FunctionPointer>等。

我糟糕的解决方案

到目前为止,这仅显示了我的猜测列表。

解决方案 1(单例,静态)

MyArray<T>在, MyArray<T1,T2>,MyMap<T1,T2>等 中创建一个静态池字段。

所有类型的数据结构都必须在需要时使用该静态池来分配内存。

坏处:-

  • 它是一个静态变量。(意义不大)
  • 很难找到应该调用全局设置语句的位置。
  • (弱)我只能使用 1 个池。(我不确定这是否有问题。)
  • mutex(弱)如果我的游戏是多线程的,我必须使用锁定池。

解决方案2(占上风)

MyArray<T>在, MyArray<T1,T2>,MyMap<T1,T2>等 中创建一个非静态池字段。

每当我想创建一个新的数据结构时,
......我必须通过共享池(来自顶级游戏逻辑)。

对于不同的情况,可以有许多池。这可能是好的。

当数据结构要分配时,它必须使用该池。

坏处:-

  • 我必须为所有类型的数据结构重构所有代码。
  • 我必须通过游泳池。代码会更脏一点。
  • mutex(弱)如果我的游戏是多线程的, 我必须使用锁定池。

解决方案3(懒惰的方式)

不要做任何事情,实体和组件的池应该足够了。
其他解决方案是过度工程。

0 投票
0 回答
152 浏览

c++ - boost::variant 类型的自定义线程本地分配器

我已经实现了一个基于 c++ 标准分配器接口的内存池。

为简单起见,上面的代码片段只显示了界面。这个想法是使用thread_local关键字为每个线程启用一个内存池。我的问题是如何使用它boost::variant从我的池中创建每个对象?对于 STL 之类std::vector的,它非常简单,因为模板参数需要一个额外的分配器字段。但是,我没有在boost::variant.

0 投票
3 回答
283 浏览

java - Akka actor 消息需要内存池

我是java新手。我是 C++ 程序员,现在学习 java 2 个月。对不起我的泳池英语。

我有一个问题,如果它需要 Akka 演员模型的内存池或对象池。我想如果我从一个演员向其他演员之一发送一些消息,我必须分配一些堆内存(就像 new Some String 或 new Some BigInteger 等等..)而且随着时间的推移,垃圾收集器将开始了(我不确定它是否会启动),它使我的应用程序计算缓慢。

所以我寻找制作内存池的方法并失败(Java不支持内存池)。而且我可以制作对象池,但在其他项目中,我没有发现有人将对象池与演员一起使用(也在 Akka 主页中)。

akka 主页中是否有关于此主题的任何文档?请告诉我链接或告诉我问题的解决方案。

谢谢。

0 投票
0 回答
154 浏览

c - 创建“中断安全”内存池

我编写了一个简单的内存池,它在多线程系统(即具有处理线程调度的操作系统的系统)上是线程安全的。它在每个函数周围使用一些简单的锁定,但它依赖于另一个线程不会永远持有锁定的事实。它使用块的链表,即链表的头部总是指向下一个空闲块(分配的块不在链表中)。

但是为了使这项工作与中断一起工作,我不能冒险锁定在中断内,我唯一能想到的是:

但这远不如带锁定的链表,因为它需要遍历整个数组。另一方面,我不想“每个中断一个内存池”,因为我希望能够在一个中断中分配并在另一个中断中释放(如果需要)。

所以我想我的问题归结为:如何创建一个可用于内存池的中断安全链表?或者(如果我做了一个“XY 问题”)我如何创建一个简单的无锁中断安全内存池,它可以在中断之间共享?

0 投票
3 回答
3117 浏览

c++ - 了解内存池

据我了解,内存池是一个块,或者是运行前在堆栈上分配的多个内存块。
相比之下,据我了解,动态内存是从操作系统请求的,然后在运行时分配到堆上。

// 编辑 //

  • 内存池显然不一定在堆栈上分配,即。内存池可以与动态内存一起使用。
  • 根据这个问题的答案,非动态内存显然也不一定在堆栈上分配。
  • 因此,尽管答案仍然相关,但“动态与静态内存”“内存池”的主题并不真正相关。

据我所知,内存池的目的是提供对 RAM 的手动管理,其中内存必须由程序员跟踪和重用。

这在理论上对性能是有利的,原因有很多:

  1. 随着时间的推移,动态内存变得碎片化
  2. CPU 可以比动态块更快地解析内存的静态块
  3. 当程序员可以控制内存时,他们可以根据具体的程序选择在最好的时候释放和重建数据。

4、多线程时,分离池允许不同线程独立运行,无需等待共享堆(Davislor)

我对内存池的理解正确吗?如果是这样,为什么似乎不经常使用内存池?