2

是否有任何已知的类似 STL 的标头容器/分配器,用于将内存块附加到另一个连续的内存区域,直到它被填满?目前我正在使用 a 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将块附加到向量已经分配的内存中以获得这样的保证只是丑陋的。有更好/更优雅的选择吗?

编辑:我无法控制内存块的分配方式。他们被给予。

4

3 回答 3

0

我知道这不是您想要的,但std::deque通常将连续的内存块拼接在一起。

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

编辑

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

vector<char> values(PRE_ALLOCATED_SIZE);
// ...
values.insert(values.end(), chunk, chunk+CHUNK_SIZE);
于 2013-01-25T11:09:57.370 回答
0

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

但是,realloc()不保证内存区域会在前一个内存位置,而是保证新块是完全连续的。有关更多详细信息,请参见手册页。

几件事情要记住:

  • 如果您通过posix_memalign()它分配内存,则不能保证将保持内存对齐
  • 无法确定是否realloc()复制了数据。
于 2013-01-25T10:25:36.633 回答
0

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

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

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

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

于 2013-01-26T00:20:50.960 回答