用于将大块内存附加到连续内存区域的良好容器

时间:2013-01-25 10:19:47

标签: c++ boost

是否有任何已知的仅限STL的容器/分配器用于将内存块附加到另一个连续内存区域,直到它被填满?目前我正在使用std::vector<char> vec,因为它有一些有用的界面,但它不是最佳的,不知怎的,我认为我是在滥用它来满足我的需求。

我首先使用std::vector::reserve来修复其容量并为所有分配所需的内存以避免不必要的重新分配,然后每次使用std::copy(&chunk[0], &chunk[size], vec.data() + vec.size())附加新的块内存到向量后面的unfilled内存区域(当然是size() <= capacity())。在每个副本之后,我明确地相应地更新向量的大小。好的,我可以使用back_inserter。但现在这不是重点(见下文)。

当然std::copy可以通过任何实现专门用于char,以便它最后可以调用memcpy,但这不是保证。我自己调用memcpy将块添加到已经由向量分配的内存中以获得这样的保证只是丑陋。是否有更好/更优雅的选择?

编辑:我无法控制如何分配内存块。给出了它们。

3 个答案:

答案 0 :(得分:0)

基本上,“真正”将内存附加到连续内存区域的唯一方法是使用Posix函数realloc()。即使使用这些已分配的区域,您也可以使用std::copy,您只需要了解您所在地区的最终位置。

但是,realloc()不保证内存区域将位于先前的内存位置,而是保证新块完全连续。有关详细信息,请参阅man页面。

要记住的事情很少:

  • 如果您通过posix_memalign()分配了内存,则无法保证将保留内存对齐
  • 无法确定realloc()是否复制了数据。

答案 1 :(得分:0)

我知道这不是你想要的,但是std::deque通常会将连续的内存块缝合在一起。

随着它的增长,没有任何重新分配,但整个数据可能不是连续的。

修改

使用带有预分配内存的vector,最后可以insert值,这不会导致重新分配,除非新值会使大小超过容量:

vector<char> values(PRE_ALLOCATED_SIZE);
// ...
values.insert(values.end(), chunk, chunk+CHUNK_SIZE);

答案 2 :(得分:0)

这可能不是你想要的,因为它们是为同质容器设计的(即所有元素都具有相同的类型)。我不知道这是否适合您的使用案例。如果您发现它很有用,我会指出:

get_temporary_buffer - 分配原始存储空间(还有一种方法可以返回存储空间)。

raw_storage_iterator - 在原始存储上输出迭代器。

uninitialized_copy_n - 将多个对象复制到原始存储中(还有一个元素版本)。