《专家C编程》一书中的内存分配练习

该隐亚伯

练习要求我查看如果在以下程序中要分配的内存块小于1MB,会发生什么情况:

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

我的笔记本电脑上的结果是

总共分配了3056 MB

比我这样更改程序:

#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

我自己更改的程序是否正确?为什么结果小于3056MB?

  1. 是的,您的程序很好。(尽管总是将兆字节的数量四舍五入有点不合标准。)

  2. 呼叫时free,您不会告诉它要释放的块有多大。这意味着内存管理系统必须知道每个块有多大。这意味着它必须将该信息存储在某个地方。由于它无法将信息存储在内存块内部,因此必须将其存储在内存块外部,这通常意味着实际上分配的内存比请求的要多。例如,它实际上可以分配一个size_t比请求的块大一个的块,将块的大小存储在开头,然后告诉您该块在size之后开始

大多数malloc实现都会在页面边界上放置大量分配(通常页面为4K)。一种方法是浪费每个分配的整个页面,仅将页面用于单个size_t值。这似乎很糟糕,但是如果您只要求半个兆字节,那么页面的大小不到分配大小的1%,浪费总内存的1%并不是那么糟糕。

假设您的malloc做到了。分配1MB块时,您设法分配了3056个块。如果每个分配比请求大4k页,则隐藏分配将为3056 * 4k,或略小于12兆字节。(实际上,它略小于12兆字节,但我要说的是mebi时,我只会继续说兆。)因此,可用的总内存为3068 MB。

当您将其更改为分配½MB块时,您将设法分配至少3045 * 2-1-的1个块(假设MB的数量已四舍五入)。那就是6089个额外的页面,大约23.8 MB,再加上3044.5 MB的分配,总共约3068.3 MB。

这些都不能证明您的malloc可以那样工作,但是至少表明了一种可能的机制。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

《忍者》一书中的javascript练习javascript

来自分类Dev

了解“ Ruby编程”一书中的“方法”

来自分类Dev

Dietel 的“C:如何编程”一书中的这个例子有什么问题?

来自分类Dev

《Essential C》一书中的 Swap() func 无法编译

来自分类Dev

为什么无法成功解释从《 Haskell中的函数编程》一书中复制的haskell代码?

来自分类Dev

《 Programming Pearls》一书中的“ pmalloc”代码

来自分类Dev

《 Programming Pearls》一书中的“ pmalloc”代码

来自分类Dev

在Stroustrup的《编程原理与实践》一书中,哪里可以找到“尝试一下”解决方案?

来自分类Dev

内存分配和C编程

来自分类Dev

这是《 SQL反模式》一书中的错字吗?

来自分类Dev

如何理解“ Think Java”一书中的摘录?

来自分类Dev

“ JavaScript:好的部分”一书中的“功能模式”的解释

来自分类Dev

试图找出 Eloquent JavaScript 一书中的代码片段

来自分类Dev

动态内存分配(C编程)

来自分类Dev

内存布局练习C ++

来自分类Dev

我对Nocolai Josuttis的“标准图书馆”一书中的以下粗体字不清楚

来自分类Dev

Yesod:卡在《七周之内七个Web框架》一书中

来自分类Dev

《 Java持久性与Hibernate,第二版》一书中的用例

来自分类Dev

在“学习Haskell带来的好处”一书中缺少“代数数据类型”的定义

来自分类Dev

实用程序类似于《 TCP / IP图解》一书中使用的“ sock”程序吗?

来自分类Dev

AttributeError:对象没有属性(例如“ Python CRASH COURSE”一书中的示例)

来自分类Dev

细分错误:11,当我测试“算法简介”一书中的堆排序代码时

来自分类Dev

动态内存分配中的C编程问题

来自分类Dev

《春季实践》一书中有关单例豆未保持状态的神秘化要求

来自分类Dev

无法通过Flask Web开发一书中所示的控制台创建sqlite3 db

来自分类Dev

c编程,c书中的数据结构,混乱

来自分类Dev

跨编程语言的动态内存分配

来自分类Dev

内存分配中的函数式编程案例

来自分类Dev

内存分配中的函数式编程案例

Related 相关文章

  1. 1

    《忍者》一书中的javascript练习javascript

  2. 2

    了解“ Ruby编程”一书中的“方法”

  3. 3

    Dietel 的“C:如何编程”一书中的这个例子有什么问题?

  4. 4

    《Essential C》一书中的 Swap() func 无法编译

  5. 5

    为什么无法成功解释从《 Haskell中的函数编程》一书中复制的haskell代码?

  6. 6

    《 Programming Pearls》一书中的“ pmalloc”代码

  7. 7

    《 Programming Pearls》一书中的“ pmalloc”代码

  8. 8

    在Stroustrup的《编程原理与实践》一书中,哪里可以找到“尝试一下”解决方案?

  9. 9

    内存分配和C编程

  10. 10

    这是《 SQL反模式》一书中的错字吗?

  11. 11

    如何理解“ Think Java”一书中的摘录?

  12. 12

    “ JavaScript:好的部分”一书中的“功能模式”的解释

  13. 13

    试图找出 Eloquent JavaScript 一书中的代码片段

  14. 14

    动态内存分配(C编程)

  15. 15

    内存布局练习C ++

  16. 16

    我对Nocolai Josuttis的“标准图书馆”一书中的以下粗体字不清楚

  17. 17

    Yesod:卡在《七周之内七个Web框架》一书中

  18. 18

    《 Java持久性与Hibernate,第二版》一书中的用例

  19. 19

    在“学习Haskell带来的好处”一书中缺少“代数数据类型”的定义

  20. 20

    实用程序类似于《 TCP / IP图解》一书中使用的“ sock”程序吗?

  21. 21

    AttributeError:对象没有属性(例如“ Python CRASH COURSE”一书中的示例)

  22. 22

    细分错误:11,当我测试“算法简介”一书中的堆排序代码时

  23. 23

    动态内存分配中的C编程问题

  24. 24

    《春季实践》一书中有关单例豆未保持状态的神秘化要求

  25. 25

    无法通过Flask Web开发一书中所示的控制台创建sqlite3 db

  26. 26

    c编程,c书中的数据结构,混乱

  27. 27

    跨编程语言的动态内存分配

  28. 28

    内存分配中的函数式编程案例

  29. 29

    内存分配中的函数式编程案例

热门标签

归档