Ale*_*lex 4 c++ winapi virtualalloc
我需要使用VirtualAlloc/VirtualAllocEx?
一个例子,我发现的一个案例 - 如果我分配了4 GB的虚拟内存,那么如果我不使用所有这些,那么我不会花费物理内存,如果我调整我的数组,我不需要做新的分配旧数据并将其复制到新数组.
struct T_custom_allocator; // which using VirtualAllocEx()
std::vector<int, T_custom_allocator> vec;
vec.reserve(4*1024*1024*1024); // allocated virtual memory (physical memory is not used)
vec.resize(16384); // allocated 16KB of physical memory
// ...
vec.resize(32768); // allocated 32KB of physical memory
// (no need to copy of first 16 KB of data)
Run Code Online (Sandbox Code Playgroud)
如果我使用标准分配器,我需要在调整大小时复制数据:
std::vector<int> vec;
vec.resize(16384); // allocated 16KB of physical memory
// ...
vec.resize(32768); // allocated 32KB of physical memory
// and need to copy of first 16 KB of data
Run Code Online (Sandbox Code Playgroud)
或者使用standatd分配器,我必须花费4GB的物理内存:
std::vector<int> vec;
vec.reserve(4*1024*1024*1024); // allocated 4GB of physical memory
vec.resize(16384); // no need to do, except changing a local variable of size
// ...
vec.resize(32768); // no need to do, except changing a local variable of size
Run Code Online (Sandbox Code Playgroud)
但是,为什么这比realloc()更好? http://www.cplusplus.com/reference/cstdlib/realloc/
还有其他案例使用VirtualAlloc [Ex]带来好处吗?
Jam*_*ess 12
VirtualAllocEx尚未提及的另一个用途是在另一个进程的地址空间中分配内存.请注意,第一个参数是进程的句柄 - 该函数在该进程的虚拟地址空间内分配内存.
我之前通过LoadLibrary在目标进程中强制调用代码将代码注入到另一个进程中时使用过它.基本步骤如下:
GetWindowThreadProcessId).OpenProcess.VirtualAllocEx.WriteProcessMemory.LoadLibrary函数的地址GetProcAddress.CreateRemoteThread开始LoadLibrary在目标进程调用,与螺纹参数是你与分配的内存VirtualAllocEx(包含DLL的名称).并不是说你需要了解所有这些,但我认为这是一个有趣的用例.
VirtualAlloc并且VirtualAllocEx在非常简单的术语分配原始网页,与所有其他存储功能malloc于GlobalAlloc所有使用VirtualAllocEx下方.问题VirtualAlloc在于它基本上是原始内存,没有可用的重新分配或重定位.因此,如果您的地址空间变得支离破碎,您无需追索,只能释放和重建.
主要用例VirtualAlloc是当你需要编写自己的内存管理器时,比如说它可以产生巨大差异的SQL实现.或者,如果您正在实现即时编译器(JIT),那么您需要能够将编译的页面上的保护标志从读/写更改为读/执行,以便不触发数据执行保护.
| 归档时间: |
|
| 查看次数: |
6511 次 |
| 最近记录: |