进行一些分析(内存和速度),我对 win7 似乎分配的 RAM 恰好是我要求的两倍这一事实感到震惊......请注意,这是我第一次在 win7 上进行此类主动分析,所以我不这样做我真的不知道会发生什么。
我在 win7(64 位)下使用 MSVC 的 Express 版本在循环中分配精确的 RAM 量。该应用程序以 32 位编译并运行。
我分配了 24 MB 的 RAM,任务管理器显示我的应用程序使用了 48MB(在所有内存列下,包括已提交的内存,因为我实际上是在新区域内进行内存复制)。当我再获得 24 个(现在应该是 48MB)时,我的应用程序会跳到 96 个,等等。
它们被分配为 1,000,000 个 24 字节结构。
我在网上搜索过,但没有发现任何与我的观察完全相符的内容。
有人知道吗?
如果这只是操作系统的欺骗(或无能?),是否有任何工具可以给我一个进程的真实内存消耗? (当应用程序一开始就涌出时,很难发现泄漏;-)
[----------已编辑,附加信息----------]
请注意(通过控制台标题栏中的路径),我正在发布模式下构建(使用 MSVC 2010 的所有默认“空”项目设置),因此没有分配额外的“调试”内存(这在一些项目)。
这是一个简短、完整的 C 应用程序,它说明了该行为:
#include <stdio.h>
#include <assert.h>
#include <conio.h>
#include <stdlib.h>
typedef unsigned int u32;
typedef struct myStruct MYS;
struct myStruct {
u32 type;
union {
u32 value;
char * str;
void * data;
MYS ** block;
MYS * plug;
};
u32 state, msg, count, index;
};
int main(int argc, char *argv[]){
int i, j;
MYS *ref;
printf ("size of myStruct: %d\n\n", sizeof(MYS));
for(i=0; i < 10; i ++){
printf("allocating started...\n");
for (j = 0; j < 1000000 ; j ++){
ref = (MYS *) malloc(sizeof(MYS));
assert(ref);
memset(ref, 0, sizeof(MYS));
}
printf(" Done... Press 'enter' for Next Batch\n");
_getch();
}
_getch();
return 0;
}
以及一张显示一次循环后我的机器上的内存的图像。每隔一次运行,它都会增加 ~48MB 而不是 24MB!