如果需要,保留和提交内存



对数组使用VirtualAlloc、保留大块地址空间以及在需要时提交页面的缺点是什么?例如,如果我知道我的数组的最大上限,我可以为它保留地址空间,使用VirtualAlloc,并在实际需要时提交内存。

与std::vector不同的是,在向数组中添加10页后,所有指针仍然有效。

我明白,这是不适合在程序中的所有数组,但在这种情况下,当我需要保存一个指针后数组增长/调整大小?

或者我应该直接使用std::deque?但是对于std::deque,我将失去连续的地址空间。

VirtualAlloc是一个底层的Windows API,它提供了很多内存分配的选项。它在特定情况下很有用,例如当您需要直接与另一个进程共享内存时。但是,不建议用于通用内存分配。

为数组使用VirtualAlloc的一个缺点是它只能在较大的块中分配内存。这意味着如果您的地址空间变得碎片化,您除了释放和重建之外没有任何追索权。此外,VirtualAlloc管理Windows虚拟内存系统中的页面,而HeapAlloc从特定的OS堆分配。您不太可能需要使用它们中的任何一个。

相反,std::vector会自动为您管理内存分配和重新分配。它可以根据需要动态增长,并且在向数组中添加新页后,所有指针仍然有效。

如果您需要在容器增长或调整大小后保存指向元素的指针,std::deque可能是一个不错的选择。std::vector将其元素存储在连续的内存块中,并且在增长时可能需要重新分配和移动其元素,而std::deque将其元素存储在多个内存块中。这意味着当std::deque增长时,它可以添加新的内存块,而不会使指向其现有元素的指针失效。

但是,请记住std::deque与std::vector相比有一些折衷。例如,它可能没有对其元素的快速随机访问,并且可能由于管理多个内存块的开销而使用更多的内存。

最新更新