是否有任何已知的仅限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
将块添加到已经由向量分配的内存中以获得这样的保证只是丑陋。是否有更好/更优雅的选择?
编辑:我无法控制如何分配内存块。给出了它们。
答案 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
- 将多个对象复制到原始存储中(还有一个元素版本)。