MEM_COMMIT
时间: 2023-11-16 13:07:49 浏览: 64
根据提供的引用内容,MEM_COMMIT是Windows API中的一个内存状态,表示已经分配了地址和物理内存。具体来说,当进程调用VirtualAlloc函数申请内存时,如果指定了MEM_COMMIT标志,那么操作系统会为该进程分配一块连续的虚拟地址空间,并且为这个地址空间分配物理内存。这样,进程就可以使用这块内存了。需要注意的是,MEM_COMMIT状态下的内存是实际占用了物理内存的,因此在使用完毕后,应该调用VirtualFree函数释放内存,以便操作系统回收物理内存资源。
代码示例:
```python
import ctypes
# 定义常量
MEM_COMMIT = 0x1000
PAGE_READWRITE = 0x04
# 调用VirtualAlloc函数申请内存
address = ctypes.windll.kernel32.VirtualAlloc(None, ctypes.c_size_t(4096), MEM_COMMIT, PAGE_READWRITE)
# 使用内存
ctypes.memset(address, b'\x00', 4096)
# 释放内存
ctypes.windll.kernel32.VirtualFree(address, 0, 0x8000)
```
相关问题
#include <windows.h> #include <iostream> #include <time.h> using namespace std; struct Cell { char data[128]; }; const int TOTAL_ROWS = 2500; const int TOTAL_COLS = 2500; int main() { clock_t t; t = clock(); Cell* p = (Cell*)malloc(TOTAL_ROWS * TOTAL_COLS * sizeof(Cell)); if (p) { cout << "ok" << endl; } else { cout << "oops" << endl; } (p + (2 * TOTAL_COLS) + 3)->data[0] = 'A'; t = clock() - t; cout << t << endl; t = clock(); p = (Cell*)VirtualAlloc(NULL, TOTAL_ROWS * TOTAL_COLS * sizeof(Cell), MEM_RESERVE, PAGE_READWRITE); if (p) { cout << "ok" << endl; } else { cout << "oops" << endl; } VirtualAlloc(p + (2 * TOTAL_COLS) + 3, sizeof(Cell), MEM_COMMIT, PAGE_READWRITE); (p + (2 * TOTAL_COLS) + 3)->data[0] = 'A'; t = clock() - t; cout << t << endl; return 0; } 在virtual的基础上进行修改,给对角线(左上到右下那条)上所有Cells中的128个元素都赋值成'A',并用clock函数测量时间。
下面是对代码的修改和解释:
```cpp
#include <windows.h>
#include <iostream>
#include <time.h>
using namespace std;
struct Cell {
char data[128];
};
const int TOTAL_ROWS = 2500;
const int TOTAL_COLS = 2500;
int main() {
clock_t t;
t = clock();
// 使用 malloc 分配内存
Cell* p = (Cell*)malloc(TOTAL_ROWS * TOTAL_COLS * sizeof(Cell));
if (p) {
cout << "ok" << endl;
} else {
cout << "oops" << endl;
}
// 给对角线上的元素赋值为 'A'
for (int i = 0; i < TOTAL_ROWS && i < TOTAL_COLS; i++) {
(p + i * TOTAL_COLS + i)->data[0] = 'A';
}
t = clock() - t;
cout << "malloc: " << t << endl;
t = clock();
// 使用 VirtualAlloc 分配内存
p = (Cell*)VirtualAlloc(NULL, TOTAL_ROWS * TOTAL_COLS * sizeof(Cell),
MEM_RESERVE, PAGE_READWRITE);
if (p) {
cout << "ok" << endl;
} else {
cout << "oops" << endl;
}
// 分配物理内存
VirtualAlloc(p, TOTAL_ROWS * TOTAL_COLS * sizeof(Cell), MEM_COMMIT, PAGE_READWRITE);
// 给对角线上的元素赋值为 'A'
for (int i = 0; i < TOTAL_ROWS && i < TOTAL_COLS; i++) {
(p + i * TOTAL_COLS + i)->data[0] = 'A';
}
t = clock() - t;
cout << "VirtualAlloc: " << t << endl;
return 0;
}
```
上面的修改中,我们在两个内存分配方式中分别给对角线上的元素赋值为 'A'。同时,我们也修改了输出的内容,分别输出使用 malloc 和 VirtualAlloc 分配内存所需的时间。
操作系统:内存分配(C语言 winapi)
在 Windows 操作系统中,内存的分配和释放可以使用 WinAPI 中的函数来完成。其中,最常用的函数是 `VirtualAlloc()` 和 `VirtualFree()`。
`VirtualAlloc()` 函数用于分配一块内存,并返回这块内存的起始地址。函数原型如下:
```c
LPVOID VirtualAlloc(
LPVOID lpAddress, // 指定欲分配内存的首地址,为 NULL 表示由系统自动分配
SIZE_T dwSize, // 指定欲分配内存的大小
DWORD flAllocationType, // 指定欲分配内存的类型,如 MEM_COMMIT、MEM_RESERVE 等
DWORD flProtect // 指定欲分配内存的保护属性,如 PAGE_READWRITE、PAGE_EXECUTE_READWRITE 等
);
```
例如,以下代码会分配一个 4KB 大小的内存块,并返回其起始地址:
```c
LPVOID p = VirtualAlloc(NULL, 4096, MEM_COMMIT, PAGE_READWRITE);
if (p == NULL) {
// 内存分配失败
}
```
`VirtualFree()` 函数用于释放先前分配的内存。函数原型如下:
```c
BOOL VirtualFree(
LPVOID lpAddress, // 指定欲释放内存的首地址
SIZE_T dwSize, // 指定欲释放内存的大小,为 0 表示释放整个内存区域
DWORD dwFreeType // 指定欲释放内存的方式,如 MEM_DECOMMIT、MEM_RELEASE 等
);
```
例如,以下代码会释放先前分配的内存:
```c
BOOL bResult = VirtualFree(p, 0, MEM_RELEASE);
if (!bResult) {
// 内存释放失败
}
```
需要注意的是,`VirtualAlloc()` 和 `VirtualFree()` 分别负责内存的分配和释放,因此在使用时要确保两者的配对。同时,内存分配和释放的过程会影响系统的性能和稳定性,因此需要谨慎使用。