mol*_*iad 6 c malloc windows-7
做一些分析(记忆和速度)我已经被win7似乎分配了我要求的RAM的两倍......这注意这是我第一次在win7上进行这样的活动分析,所以我不知道我真的知道会发生什么.
我在win7(64位)下使用MSVC的快速版本在循环中分配精确数量的RAM.应用程序已编译并以32位运行.
我分配了24 MB的ram,任务管理器将我的应用程序显示为使用48MB(在所有内存列下,包括已提交,因为我实际上是在新区域内进行memcopy).当我得到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;
}
Run Code Online (Sandbox Code Playgroud)
和一个图像,显示一个循环后我的机器上的内存.每隔一次运行,就会增加~48MB而不是24MB!

这可能是由于填充、内部管理结构和内存对齐限制的组合所致。
当您调用 时malloc(size),您实际上并没有获得字节缓冲区size。您将获得一个至少为字节的缓冲区size。这是因为,出于效率原因,您的操作系统更喜欢仅使用几种不同大小的内存缓冲区,并且不会定制缓冲区以节省空间。例如,如果您在 Mac OS 上请求 24 字节,您将得到 32 字节的缓冲区(浪费 25%)。
添加到该分配开销中,您的操作系统用于管理malloced 缓冲区的结构(可能会在每个分配中占用一些额外字节),并且填充可能会增加对象的大小(达到编译器首选对齐方式的倍数),并且您会发现将数百万个小对象分配到单独的缓冲区中是非常昂贵的。
长话短说:只分配一个大缓冲区sizeof (YourType) * 1000000,您不会看到任何明显的开销。分配一百万个sizeof (YourType)对象,最终会浪费大量空间。