c++ - 为动态数组预留较大的虚拟内存空间,并根据需要映射核心内存
问题描述
我需要一个大型动态数组。我不知道它可以达到的最大大小,但我可以设置一个很大的上限,比如 1 GB。
我知道的动态数组实现,当它们达到最大容量时,分配一个新的更大的缓冲区,将数据复制到它并释放旧的缓冲区。我想避免这种情况,所以我正在考虑保留一大块虚拟内存,并且只在需要时将虚拟内存页面映射到物理内存。除了效率之外,这种方法的一个很好的特点是保证项目的地址永远不会改变。
我正在考虑类似这样的逻辑:
// the memory used by the dynamic array
item_t* buffer = reserve_virtual_memory( 1gigabyte );
size_t len = 0; // how many items the dynamic array contains
size_t pages = 0; // how many virtual memory pages are in use
// computes how many memory pages are needed to store `len` items
size_t needed_pages( size_t len ) {
return ( sizeof(item_t)*len - 1 ) / page_size + 1;
}
item_t* new_item() {
len += 1;
if( needed_pages(len) != pages ) {
ASSERT( needed_pages(len) == pages+1 );
pages += 1;
map_memory_page( buffer + pages*page_size );
}
}
void pop_item() {
len -= 1;
if( needed_pages(len) != pages ) {
ASSERT( needed_pages(len) == pages-1 );
release_memory_page( buffer + pages*page_size );
pages -= 1;
}
}
我应该能够在 Linux 上使用mmap
and来实现这个逻辑madvise
。
我在想:
将这种设计用于大型动态数组有什么缺点吗?
这是一个常见的解决方案吗?它有名字吗?有没有已经实现它的库?
它可以在每个/大多数平台上实现吗?包括WebAssembly之类的虚拟机?
解决方案
推荐阅读
- java - 使用 JSF 升级 JBoss 7.2 - 范围类型 javax.enterprise.context.SessionScoped 没有活动上下文
- php - 无法使用 symfony 保存静态数据
- python - 读取和写入变量到文件python
- c++ - LeetCode(不重复字符的最长子串)
- python - Django 不一致的查询集结果
- java - 如何将 JSON 文件转换为 List
- javascript - 如何用js清除tokenfield
- haskell - 将 IO 字符串转换为 [Char]
- reactjs - webpack 将项目拆分成包
- bash - Grep 完全匹配没有破折号