首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“专家C编程”一书中的内存分配练习

“专家C编程”一书中的内存分配练习
EN

Stack Overflow用户
提问于 2014-06-05 04:48:21
回答 2查看 130关注 0票数 4

这个练习要求我看看如果在下面的程序中分配的内存块小于1MB会发生什么:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
main()
{
    int MB=0;
    while(malloc(1<<20))
        ++MB;
    printf("Allocated %d MB total\n",MB);
}

我笔记本电脑的结果是

拨款3056 MB

而不是像这样改变程序:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
main()
{
    int MB=0;
    while(malloc(1<<19))
        ++MB;
    printf("Allocated %d MB total\n",MB/2+MB%2);
}

结果是

分配的3045 MB共计

我自己修改的程序正确吗?为什么结果小于3056 is?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-05 05:12:47

  1. 是的,你的计划很好。(尽管总要把兆字节数相加,但这有点不合标准。)
  2. 当您调用free时,您不会告诉它您正在释放的块有多大。这意味着内存管理系统必须知道每个块有多大。这意味着它必须将这些信息存储在某个地方。因为它不能在内存块中存储信息,所以它必须将它存储在块之外,这通常意味着实际分配的内存比请求的要多一些。例如,它实际上可以分配一个比请求的块大一个size_t的块,在开始时存储块大小,然后告诉您该块是在大小之后开始的。

大多数malloc实现都会在页面边界上进行大量的分配(通常一个页面是4K)。一种方法是为每个分配浪费整个页面,只对单个size_t值使用该页面。这听起来很糟糕,但如果你想要半兆字节,一页不到分配大小的1%,浪费1%的总内存也没那么可怕。

假设是你的马洛干的。当您分配1MB块时,您将设法分配其中的3056个。如果每个分配比请求大一个4k页,隐藏分配将为3056*4k,或略小于12 is。(实际上它略小于12 兆字节,但我要继续说mega,我的意思是mebi。)所以可用的总内存应该是3068 MB。

当您将其更改为分配半MB块时,您至少可以分配其中的3045*2-1块(假设MB的数量被舍入)。这是6089个额外页面,约为23.8MB,再加上3044.5 MB的分配,总共约为3068.3 MB。

所有这些都不能证明您的malloc是这样工作的,但它至少显示了一种可能的机制。

票数 4
EN

Stack Overflow用户

发布于 2014-06-05 05:23:20

1.当你运行这个程序时,你不会每次都得到相同的结果。因为您正在从堆中分配1MB的内存块,直到内存可用为止,并且可用内存在perticular中可能会有所不同。

2.你的代码中没有任何错误。

3.在分配内存后,没有分配内存,因此一般操作系统释放了程序exists.This后分配的内存,而嵌入式操作系统一般不为您释放内存。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24051827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档