问题标签 [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 投票
2 回答
367 浏览

c++ - 将大向量分块为较小的向量,无需额外的堆分配

我需要用一个连续的堆分配替换 3 个 std::vector 实例的 3 个堆分配,然后在这 3 个向量之间共享它。这些向量大小不会改变,所以我不需要担心在向它们推送或插入元素的情况下分配新的连续存储。我的实验结果表明,当我将这 3 个大小为n的向量替换为一个大小为 *3*n* 的向量时,对于不同的大小,我的速度提高了 2 倍。

但是,我不知道如何在不进行任何额外堆分配的情况下,从大向量中制作出更小的向量。

我尝试编写自己的向量类,它的构造函数接受两个迭代器,指定底层_vec存储部分的开始和结束属于该向量,但是当涉及到释放资源的工作时,这听起来不是一个干净的解决方案基础向量不再可访问并解决内存泄漏问题。

显然使用在这三个向量之间共享的自定义分配器并分配一次连续内存并将其分配给相应的向量似乎是一个更好的解决方案,但是由于我从未编写过一个,任何帮助我开始编码的提示或建议将是赞赏。

0 投票
2 回答
796 浏览

c++ - 从Boost object_pool构造的指针的C ++ Boost二进制序列化

我的应用程序有一个类“MyClass”。它的对象是从 Boost Object_pool 构建的。

我需要通过 Boost Binary Serialization 对此类对象进行序列化/反序列化。

对于序列化 -

我从池中取出一个指针,进行一些操作并通过 Boost 二进制序列化对其进行序列化。到目前为止一切都很好。

对于反序列化 -

我获取该序列化缓冲区并使用 Boost 二进制序列化对其进行反序列化。反序列化成功发生,但在此过程中,新内存是由不是从对象池构造的 Boost 序列化机制分配的。
如果我在反序列化之前从池中分配指针,则反序列化会再次在堆上分配内存,并且池中的内存轨迹会丢失。因此,我将无法重用由 boost 序列化机制分配的内存,因为它不是从池中构造的,因此无法返回给对象池。

我需要的 -

我想将缓冲区反序列化为从池中分配的指针。

浏览 Boost 序列化文档,发现二进制对象包装器的概念,但它导致编译错误。

主功能 : -

它给出了以下编译错误:-

将序列化与对象池一起使用是否正确?
帮助将不胜感激。

0 投票
1 回答
105 浏览

c - 对于通用内存池,如何在 C 中的指针之间自由转换?

我开始实现一个通用内存池。这是出于学习目的,所以肯定有很多错误。但是,我在前进。现在我被困在一个新的部分。一、代码

目前,它的大小是 128 字节,但是一旦我掌握了基础知识,我就会让它变得无限大。分配可能工作正常,您可以看到输出并看到我可以设置分配的指针并使用该值。最重要的是,我想实现free. 它在注释掉的函数pool_free中。要执行memmove,我需要知道mem_block要删除的索引。

在 中pool_allocate,您可以看到我返回了data分配块的指针,而不是整个内容,因此它可以像常规一样使用malloc。这意味着,在释放时,我需要mem_block从数据指针中恢复。为了能够做到这一点,我将data指针作为 a 的第一个元素mem_block

让我进一步解释代码

c3这里是分配使用pool_allocate和结果指向数据的指针,uint8_t*实际上被强制转换complex *为使用。所以c3指向一个complex对象。取消引用应该提供实际数据,我认为这是可行的。但它也有自己的地址。我认为这个地址与其块的指针相同,data因为它是 a 中的第一个成员mem_block。所以我将它自由地转换为mem_block*. 但这不起作用。

Position of c3 is 0或其他胡言乱语。我期待看到 16、32 等内容,因为每个mem_block都是 16 个字节。那么,为什么你认为演员

不会让我和它一起工作c3mem_block?也许我无法通过引用正确传递指针,因此对指向的事物的更改在外部不可见?这似乎不太可能,因为我可以按预期使用分配的对象,但谁知道呢?我检查了每个部分,但仍然无法解决问题。

0 投票
1 回答
63 浏览

c++ - MemoryPool 的确定性编译时间映射函数

请参考下面的图片,我试图展示我正在尝试实现的内容: 在此处输入图像描述

在包含各种大小的内存中,有几个Partition静态分配的内存,在编译时是已知的。chunks每个分区都有chunks不同的大小。Partition实现IPartition接口。指针IPartition *在 C 样式数组中组织,其中idx是该数组的索引,范围为0..nPartitions.

在我的自定义operator new(size_t size)实现中,我将使用上述概念返回一个适当大小的内存块,任何大小的类型都适合。明显的要求是块大小必须等于或大于类型的大小。

目标/任务/问题:

我需要设计一个函数,该函数constexpr unsigned int func( size_t size )采用size要分配的对象并将索引返回到指针idx数组,IPartition *该指针指向具有适当块的“正确”分区size

为了使事情变得更复杂,必须花费一个恒定的时间来使用内存池确定性func()来保持整个内存分配。

整件事都指向我,std::unordered_map但目标系统是资源有限的小型 MCU。也许解决方案可能是一个哈希表,其中在编译时计算哈希(分区数和块大小在编译时已知),我不知道......

如果有人可以帮助我遵循最佳方式,我将非常高兴...

非常感谢任何愿意提供帮助的人!

0 投票
0 回答
109 浏览

c - 如何使用命令或调试文件在 open-vswitch 的内存池中查找空闲元素的大小?

我正在调试 open-vswitch 并希望在一个内存池中找到空闲元素的大小。我使用命令:

我得到输出:

但我不知道我的目标是哪条线?如果输出中没有目标,我该如何找到它?

0 投票
1 回答
529 浏览

c++11 - 管理单个内存块的分配器

由于系统限制,假设我只能从堆中分配内存一次(例如使用std::allocator或其他更通用的 C++11 兼容分配器)。

这种单一分配将占用很大的内存块。然后我想使用容器和动态内存,但都限于先前分配的内存块。

我设法编写了一个非常简单的分配器,它逐渐“提供”内存移动指针。在这个分配器deallocate中是无操作的,并且来自块的内存不会返回到块。显然可以做得比这更好。换句话说,我想要一个托管堆。

按顺序重用此块内存是一个难题,因为需要管理不连续的空闲段、碎片整理、(可选)线程安全等。

这个图案叫什么名字?有一段时间我认为这是一个池分配器,但它似乎指的是其他东西(重用小对象)。

我可以使用 C++ 的哪些功能或标准库来实现和管理此类分配,或者至少可以毫不费力地构建自己的?

我希望能在 Boost 中找到一些东西。但是 Boost.Pool 是另外一回事,看起来像这样的东西是在 Boost.Interprocess 中为特定目的而实现的,但它似乎并不容易使用,而且我很难在它们的原型使用之外理解它(例如进程间共享内存。)

否则,我发现的最接近的是这个https://www.boost.org/doc/libs/1_41_0/libs/pool/doc/interfaces/pool_alloc.html,但似乎::new可以多次调用。

示例代码:

0 投票
1 回答
206 浏览

c++ - 在 C++ 中具有模板初始化的静态结构指针

我正在实现一个简单的 MemPool。MemPool 以 LinkList 的形式实现。但我不知道声明

正确。

这就是我使用它的方式:

它得到编译错误:错误:专门成员'mempool<120>::free_mem_head'需要'template<>'语法节点* mempool::free_mem_head=NULL;

0 投票
1 回答
46 浏览

c++ - 从 void 指针初始化类/结构

我有一个分配为 char* 的内存池。当我想创建一个对象时,我从该池中请求内存,该内存在该池中的某处返回一个 char* 强制转换为 void*。

所以当我创建一个对象时,我会这样做

但这不允许我访问 Data 类的构造函数,我必须在创建它之后分配值。

无论如何要改变它以允许我以与我相同的方式传递参数

不确定是否可能。

0 投票
1 回答
111 浏览

c++ - Realigning pointers after memory realign

I have a memory pool which is a set size and is split into segments of a given size. When I delete some data it flags the segments that data was using as free. Next time I try to allocate memory but don't have space, I realign the memory by shifting all the data down (e.g. First 2 segments are cleared, move all data down by 2 blocks). This all works fine but my issue is my pointers to that data don't change and I am not sure how I can go about doing this.

I allocate memory from my pool by returning a void* to the space in memory, lets assume my pool is the size to hold 2*sizeof(Data).

So the pool has no reference to the pointer poolTest.

So now if I do this:

The creation of poolTest3 triggers a realignment of memory and now poolTest2 points to the same address as poolTest3 and poolTest1 points to the address that poolTest2 should point to.

I might just be missing something, or my structure is screwed up but I am really stuck on this.

0 投票
2 回答
263 浏览

c - Malloc 函数在运行时返回的最大大小是多少?

问题1:MALLOC可以分配的最大内存是多少? 问题2:Malloc 是分配用户请求的所有内存还是仅分配大量内存。

我试图找到动态分配的内存大小,但没能做到。很多人在stackoverflow上写过,你找不到动态内存的大小。这是真的吗?

我已经尝试了这些对于动态内存分配不正确的步骤。

没有错误,但输出不正确。