将多个内存块呈现为单个连续块的容器
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::copy
和std::search
等算法完全无关。【参考方案3】:
所以,在获取所有数据后,我有一个内存块列表。而且我需要将一些 STL 算法(搜索、复制等)应用于整个数据。有一种解决方案可以编写容器来保存有关这些块的信息 + 转发迭代器,它能够从一个块“跳转”到另一个块。
听起来您需要一个无缝遍历所有块的迭代器。 std::deque<>
提供了类似的迭代器,因为它也以块的形式分配内存。
除非你真的需要它在一个连续的内存块中。在这种情况下,所有块都需要复制到一块连续的内存中。
【讨论】:
以上是关于将多个内存块呈现为单个连续块的容器的主要内容,如果未能解决你的问题,请参考以下文章