malloc

malloc函数在运行时分配内存。它需要以字节为单位的大小并在内存中分配那么多空间。这意味着malloc(50)将在内存中分配50个字节。它返回一个void指针

calloc

与malloc一样,calloc也在运行时分配内存,并在stdlib.h中定义。它需要元素的数量和每个元素的大小(以字节为单位),将每个元素初始化为零,然后返回一个指向内存的void指针。

void * calloc(n,element-size);

这里,'n'是元素的数量,'element-size'是每个元素的大小。

这里都会指定大小, 那为什么free的时候,只需要void free(指针)呢?

比较常见的实现是隐藏块头

https://www.zhihu.com/question/20362709

当调用malloc(size)时,实际分配的内存大小大于size字节,这是因为在分配的内存区域头部有类似于
struct control_block {
unsigned size;
int used;
};
这样的一个结构,如果malloc函数内部得到的内存区域的首地址为void *p,那么它返回给你的就是p + sizeof(control_block),而调用free(p)的时候,该函数把p减去sizeof(control_block),然后就可以根据
((control_blcok*)p)->size得到要释放的内存区域的大小。这也就是为什么free只能用来释放malloc分配的内存,如果用于释放其他的内存,会发生未知的错误。

但是当有大量的小的内存块分配的时候, 都需要加上块头,这种分配分式就不友好啦.

基于chunk 的管理

https://www.zhihu.com/question/302440083

把整个虚拟内存地址空间分成(看作)连续的 chunk,每一个 chunk 有固定的尺寸(一般是 4k*n,n >= 1),并且按自身对齐。以 4k 为例,那么第一个 chunk 是 [0,4095] 这一段,第二个 chunk 是 [4096,8191],第三个 [8192,12287]…以此类推。每一次从虚拟内存上分配时都按 chunk 分配(因为虚拟内存是基于 paging 的,所以一定能保证按自身对齐),然后再在 chunk 上管理小尺寸分配。这样,在 free 的时候,只要把入参地址除以 chunk 的尺寸(实践中是地址对齐,用位运算即可),就能得到这个地址所属的 chunk。chunk 的头部存放了它的管理结构,所以能得知 free 的正确尺寸。chunk 管理上可以有不同的算法,一个比较有效的做法是 freelist:即把一个 chunk 再分成若干个相同尺寸的小块,并用指针把它们连接起来形成链表结构,malloc 和 free 都维护这个链表就行了。不同尺寸的 malloc 会落入不同的 chunk,而 free 总是能找到对的那个 chunk。

malloc返回的指针有双重作用,一是新分配的内存起始地址,二是内存资源的句柄(Handle),即管理器内部分配的编号。

对于任何资源管理器来说,只要给出句柄就能找到资源的全部信息了。

c的free 为什么不需要知道大小的更多相关文章

  1. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

  2. 8.仿阿里云虚拟云服务器的FTP(包括FTP文件夹大小限制)

    平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html#iis 原文:http://dnt.dkill.net/Ar ...

  3. JavaScript动画-拖拽改变元素大小

    ▓▓▓▓▓▓ 大致介绍 拖拽改变元素大小是在模拟拖拽上增加了一些功能 效果:拖拽改变元素大小 ▓▓▓▓▓▓ 拖拽改变元素大小原理 首先这个方块得知道我们想要改变这个它的大小,所以我给它设定一个范围,当 ...

  4. C#中如何调整图像大小

    在本篇文章中,我将介绍如何在C#中来调整你想要的图像大小.要实现这一目标,我们可以采取以下几个步骤: 1.首先要获取你想要调整大小的图像: string path = Server.MapPath(& ...

  5. javascript动画系列第四篇——拖拽改变元素大小

    × 目录 [1]原理简介 [2]范围圈定 [3]大小改变[4]代码优化 前面的话 拖拽可以让元素移动,也可以改变元素大小.本文将详细介绍拖拽改变元素大小的效果实现 原理简介 拖拽让元素移动,是改变定位 ...

  6. 1199 Problem B: 大小关系

    求有限集传递闭包的 Floyd Warshall 算法(矩阵实现) 其实就三重循环.zzuoj 1199 题 链接 http://acm.zzu.edu.cn:8000/problem.php?id= ...

  7. Android SearchView 自定义SearchIcon和字体颜色大小

    自定义SearchView的搜索图标和字体属性相对复杂一些,记下来. 一.自定义SearchIcon 1.API版本低于21:版本小于21时,要修改SearchIcon比较复杂,需要先获取到Searc ...

  8. ARM CPU大小端

    ARM CPU大小端: 大端模式:低位字节存在高地址上,高位字节存在低地址上 小端模式:高位字节存在高地址上,低位字节存在低地址上 STM32属于小端模式,简单的说,比如u32 temp=0X1234 ...

  9. [函數] Firemonkey Android 取得系统参数设定的字型大小

    Android 系统参数设定内,可以设定字型大小: 可以透过下面代码来取得字型大小比例: function FontScale: Single; var Resources: JResources; ...

  10. [转载]windows 7 IIS 7.5 ASP.Net 文件上传大小限制

    原文出处: 原文作者:云中岳 原文链接:http://www.cnblogs.com/netlover/archive/2011/07/08/Win7_IIS_Upload.html IS 7 默认文 ...

随机推荐

  1. linux中()、[]、{}、(())、[[]]等各种括号的使用

    转至:https://www.jianshu.com/p/b88c7e07aaa9 linux中().[].{}.(()).[[]]等各种括号的使用 1.小括号.圆括号() 1.1 单小括号() 命令 ...

  2. Linux主机内存评估手册-从零到无

    --时间:2020年10月22日 --作者:飞翔的小胖猪 文档基于Centos Linux操作系统作为生产服务器运行环境.实时的查看分析当前系统内存的使用情况是否存在内存瓶颈,结合应用及现行业务需求分 ...

  3. Spring 5 , 狭义上的spring 以及 广义上的spring , spring 设计模式

    Spring 5 距离 Spring4 发布有4年多, 所以说Spring 5是一个重要的版本 要构建和运行Spring 5应用程序, 至少需要Java EE 7 和JDK 8 , 之前的JDK和Ja ...

  4. Python:Scipy.interpolate

    注意 以下插值函数中,待插值点的坐标,最好按次序排列(参与插值的基准点的坐标可以打乱次序).如果打乱顺序,可能会导致插值结果异常(插值异常而不是错误,不会报错,但是结果有明显异常). griddata ...

  5. VirtualBox虚拟机--桥接模式

    问题概述:VirtualBox虚拟机设置桥接模式,与宿主机互相ping通. 注:如果按照以下方式设置了还是ping不通,查看虚拟机防火墙是否已关. 公司电脑拿去维修了,在自己家里电脑上部署项目开发环境 ...

  6. 用Vue编写一个简单的仿Explorer文件管理器

    ​大家一定很熟悉你桌面左上角那个小电脑吧,学名Windows资源管理器,几乎所有的工作都从这里开始,文件云端化是一种趋势.怎样用浏览器实现一个Web版本的Windows资源管理器呢?今天来用Vue好好 ...

  7. 基于Zookeeper的分布式锁(干干干货)

    原文地址: https://juejin.im/post/5df883d96fb9a0163514d97f 介绍 为什么使用锁 锁的出现是为了解决资源争用问题,在单进程环境下的资源争夺可以使用 JDK ...

  8. 10 Java的方法 可变参数

    5.可变参数 JDK 1.5开始,Java支持传递同类型的可变参数给一个方法. 在方法声明中,在制定参数类型后加一个省略号(-). 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数.任何普通 ...

  9. 大数据教程-01HDFS的基本组成和原理

    一 Hadoop历史背景 起源于2003年谷歌的Google File System相关论文,随后Doug Cutting(我们下面就叫他切哥吧)基于GFS的论文实现了分布式文件系统,并把它命名为ND ...

  10. vue3-码一下组件的v-model

    RT,码一下组件的v-model,知识点太多,没听懂...,后面学完回来再仔细看看