关于用malloc申请内存后的系统开销

zmsun 2009-03-23 10:25:39
上次去面试,面试人问了我这个问题

说如果使用malloc分配内存,让我写一个算法,计算出使用malloc后实际的系统开销

是不是这个系统开销包括(指定申请的大小)+(这块内存信息的大小)

怎么计算呢???
...全文
261 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyyapple 2009-03-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 arong1234 的回复:]
没有用的,malloc不会使用VirtualAlloc去分配内存,它是在一块用VirtualAlloc分配的大内存中(叫做堆)上分配的。也就是说,你可能用VirtualAllocEx分配一个N-MB的内存,你的new和malloc都在这块内存中分配。无论你new多少次,VirtualQueryEx都不会有直接的影响
引用 9 楼 yyyapple 的回复:
引用 7 楼 yyyapple 的回复:
试试
在windows下使用VirtualQueryEx查看进程malloc前后虚拟内存大小变化呢



C/C++ codeDWORD…
[/Quote]

lz说的是计算出使用malloc后实际的系统开销

既然这样,那就没有系统开销了,直接从分配的虚拟缓冲空间中取就行了

但我运行后确是还是有变化的,当分配的空间远远小于1个页面时,像你说得直接取,如果大于一个页面大小,还是需要增加虚存空间大小的

arong1234 2009-03-23
  • 打赏
  • 举报
回复
没有用的,malloc不会使用VirtualAlloc去分配内存,它是在一块用VirtualAlloc分配的大内存中(叫做堆)上分配的。也就是说,你可能用VirtualAllocEx分配一个N-MB的内存,你的new和malloc都在这块内存中分配。无论你new多少次,VirtualQueryEx都不会有直接的影响
[Quote=引用 9 楼 yyyapple 的回复:]
引用 7 楼 yyyapple 的回复:
试试
在windows下使用VirtualQueryEx查看进程malloc前后虚拟内存大小变化呢



C/C++ codeDWORD ret=1;
DWORD add=0,adds=0, add2=0, add2s=0;
MEMORY_BASIC_INFORMATION mbi;
char* tb= 0;

while((ret=VirtualQuery((LPCVOID)add,&mbi, sizeof(MEMORY_BASIC_INFORMATION)))
==sizeof(MEMORY_BASIC_INFORMATION))
{
if (mbi.State == MEM_COM…
[/Quote]
yyyapple 2009-03-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yyyapple 的回复:]
试试
在windows下使用VirtualQueryEx查看进程malloc前后虚拟内存大小变化呢
[/Quote]

DWORD   ret=1;   
DWORD add=0,adds=0, add2=0, add2s=0;
MEMORY_BASIC_INFORMATION mbi;
char* tb= 0;

while((ret=VirtualQuery((LPCVOID)add,&mbi, sizeof(MEMORY_BASIC_INFORMATION)))
==sizeof(MEMORY_BASIC_INFORMATION))
{
if (mbi.State == MEM_COMMIT)
{
adds += mbi.RegionSize;
}
add+=mbi.RegionSize;
}

tb= (char*)malloc(10000);
while((ret=VirtualQuery((LPCVOID)add2,&mbi, sizeof(MEMORY_BASIC_INFORMATION)))
==sizeof(MEMORY_BASIC_INFORMATION))
{
if (mbi.State == MEM_COMMIT)
{
add2s += mbi.RegionSize;
}
add2+=mbi.RegionSize;
}

printf("%d - %d = %d\n",add2s, adds, add2s-adds);
free(tb);
arong1234 2009-03-23
  • 打赏
  • 举报
回复
以vc为例子,在release版本中,它在开辟的内存前放了一个16字节或者32字节的内存块保存内存分配信息。在debug版本中,除此之外,还在内存前后各放置了一些填充了0xCD的字节,这样可以在debug状态下检测内存访问越界。连同一个编译器还不同,更何况不同编译器。对于这种面试,其实正确的答案是没有的,你只要能说这么多估计就足够好了

[Quote=引用 6 楼 kok202 的回复:]
我也查了很多,就是想不通啊,郁闷
[/Quote]
yyyapple 2009-03-23
  • 打赏
  • 举报
回复
试试
在windows下使用VirtualQueryEx查看进程malloc前后虚拟内存大小变化呢
zmsun 2009-03-23
  • 打赏
  • 举报
回复
我也查了很多,就是想不通啊,郁闷

tian428 2009-03-23
  • 打赏
  • 举报
回复
mark
fibbery 2009-03-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 kok202 的帖子:]
上次去面试,面试人问了我这个问题

说如果使用malloc分配内存,让我写一个算法,计算出使用malloc后实际的系统开销

是不是这个系统开销包括(指定申请的大小)+(这块内存信息的大小)

怎么计算呢???
[/Quote]

不同的编译器,策略确实不一样,但是对于大多数编译器来说,对于malloc,都会申请一个指定大小的区域块,和一个结构体,结构体的内容保存了区域块的指针和大小。也许还有其他信息,这个属于太底层的知识,对于一个程序员来说,不知道也无所谓,知道了也是针对某一款编译器,也不见得通用。我到非常想知道面试官心里的答案是什么。
  • 打赏
  • 举报
回复
需要额外的指针来维护malloc到的数据的,很麻烦的。
楼主可以看下malloc.h
arong1234 2009-03-23
  • 打赏
  • 举报
回复
没法计算,不同的库、不同编译器和不同的编译条件都不一样
面试官不知道怎么想

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧