使用VirtualAlloc的缺点是什么数组,保留大块的地址空间,并提交页面时,他们需要?例如,如果我知道我的数组的最大上限,我可以保留地址空间,使用VirtualAlloc,并提交内存,如果我真的需要它。与std::vector不同的是,在向数组添加所需页面后,所有指针都将保持有效。我明白这并不适合程序中的所有数组,但在数组增长/调整大小后需要保存指针的情况下?或者我应该只使用std::deque?但是使用std::deque我会丢失continues地址空间。
lqfhib0f1#
VirtualAlloc是一个低级的Windows API,它提供了大量的内存分配选项。它在特定情况下很有用,例如当您需要直接与另一个进程共享内存时。However, it is not recommended for general-purpose memory allocation。对于数组使用VirtualAlloc的一个缺点是它只能在较大的chunk中分配内存。This means that if your address space becomes fragmented, you have no recourse but to release and rebuild。此外,VirtualAlloc管理Windows虚拟内存系统中的页面,而HeapAlloc从特定的OS堆进行分配。您不太可能需要使用它们中的任何一个。相比之下,std::vector会自动为你管理内存分配和重新分配。它可以根据需要动态增长,并且所有指针在向数组添加新页面后仍然有效。If you need to save pointers to elements in a container after it grows or resizes, std::deque could be a good option。与std::vector不同,std::deque将其元素存储在连续的内存块中,并且在增长时可能需要重新分配和移动其元素,std::deque将其元素存储在多个内存块中。这意味着当std::deque增长时,它可以添加新的内存块而不会使指向其现有元素的指针无效。但是,请记住,std::deque与std::vector相比有一些折衷。例如,it may not have as fast random access to its elements和可能会由于管理多个内存块的开销而使用更多内存。
std::deque
std::vector
1条答案
按热度按时间lqfhib0f1#
VirtualAlloc是一个低级的Windows API,它提供了大量的内存分配选项。它在特定情况下很有用,例如当您需要直接与另一个进程共享内存时。However, it is not recommended for general-purpose memory allocation。
对于数组使用VirtualAlloc的一个缺点是它只能在较大的chunk中分配内存。This means that if your address space becomes fragmented, you have no recourse but to release and rebuild。此外,VirtualAlloc管理Windows虚拟内存系统中的页面,而HeapAlloc从特定的OS堆进行分配。您不太可能需要使用它们中的任何一个。
相比之下,std::vector会自动为你管理内存分配和重新分配。它可以根据需要动态增长,并且所有指针在向数组添加新页面后仍然有效。
If you need to save pointers to elements in a container after it grows or resizes,
std::deque
could be a good option。与std::vector
不同,std::deque
将其元素存储在连续的内存块中,并且在增长时可能需要重新分配和移动其元素,std::deque
将其元素存储在多个内存块中。这意味着当std::deque
增长时,它可以添加新的内存块而不会使指向其现有元素的指针无效。但是,请记住,std::deque与std::vector相比有一些折衷。例如,it may not have as fast random access to its elements和可能会由于管理多个内存块的开销而使用更多内存。