将多个内存块呈现为单个连续块的容器

Posted

技术标签:

【中文标题】将多个内存块呈现为单个连续块的容器【英文标题】:Container to present multiple memory chunks as single continuous one 【发布时间】:2012-03-19 08:10:22 【问题描述】:

是否有一些“标准”容器(STL、boost)可以将多个内存块呈现为单个连续的块?我需要处理一些具有以下条件的数据:

事先不知道数据的总大小(网络响应) 内存是按块分配的(带有一些我无法控制的外部分配功能) 内存释放不受我控制,因此重新分配相对昂贵

所以,在获取所有数据后,我有一个内存块列表。而且我需要将一些 STL 算法(搜索、复制等)应用于整个数据。有一种解决方案可以编写容器来保存有关这些块的信息 + 转发迭代器,它能够从一个块“跳转”到另一个块。

但问题似乎相当普遍,所以我希望有一些我缺少的众所周知的答案。提前致谢。

【问题讨论】:

【参考方案1】:

记忆是提供给你的,你说。听起来你不想复制它。没问题,STL 理念非常灵活。您实际上并不需要容器;它们只是用于内存管理,并且已经处理好了。

需要的是一个迭代器。没有标准的;你必须自己写一个。有太多的细微变化无法为此提供标准解决方案。但别担心,这很容易。如果您从std::iterator<value_type> 继承,您将获得必要的typedef,因此您只需编写operator*(直截了当)和operator++/operator--/operator+/operator-(理解块)。

【讨论】:

我完全同意我需要一个迭代器,并且我已经提到它作为一种可能的解决方案。但是使用没有容器的迭代器对我来说看起来很奇怪。因为我应该以某种方式得到我的begin()end(),所以将这些东西封装在容器中似乎很自然。也许我在这里误用了 container 这个词。我不是在谈论 STL 容器的概念,而是在谈论一些用于封装它们的单独块的“持有者”。我只是希望我不应该自己实现这些东西。无论如何,谢谢你的回答。 "Container" 在 C++ 中有很好的定义(这是标准的第 23 章)。【参考方案2】:

我需要类似的东西,在环顾四周后,我自己写了,基于重载 [] 运算符。有关相关问答,请参阅以下主题;

Can I use the [] operator in C++ to create virtual arrays

Good C++ array class for dealing with large arrays of data in a fast and memory efficient way?

【讨论】:

operator[]std::copystd::search 等算法完全无关。【参考方案3】:

所以,在获取所有数据后,我有一个内存块列表。而且我需要将一些 STL 算法(搜索、复制等)应用于整个数据。有一种解决方案可以编写容器来保存有关这些块的信息 + 转发迭代器,它能够从一个块“跳转”到另一个块。

听起来您需要一个无缝遍历所有块的迭代器。 std::deque<> 提供了类似的迭代器,因为它也以块的形式分配内存。

除非你真的需要它在一个连续的内存块中。在这种情况下,所有块都需要复制到一块连续的内存中。

【讨论】:

以上是关于将多个内存块呈现为单个连续块的容器的主要内容,如果未能解决你的问题,请参考以下文章

C ++中连续内存的含义是啥?

Pandas 和多处理内存管理:将 DataFrame 拆分为多个块

多个指向C中重新分配的内存块的指针

使用单个连续的内存块索引3维数组

内存管理(上)

C++ 中 vector 如何实现内存分配