实现 malloc() 和 free() — 进一步减少堆-C

首页 2024-07-10 10:21:00

本文是关于实现的 malloc() 和 free() 函数系列文章的一部分。在最后一篇文章中,我们学会了如何重用内存块。这是一个很大的进步,但还有更多的改进空间。

一个例子是减少堆的大小,如第一篇文章所述。当我们释放最后一个内存块时,我们将堆的顶部移动到前一个块的末端。然而,前一个块和其他块也可能是免费的。考虑以下场景:

void *ptr1 = abmalloc(8);
无效 *ptr2 = abmalloc(8);
abfree(ptr1);
abfree(ptr2);

在这种情况下,当我们释放它时 ptr2 当指向块时,我们使用它 ptr1 成为最后一块。但是ptr1也是免费的,所以我们可以进一步减少堆的大小。

为了实现这一点,我们将从列表的末尾迭代指针,直到没有更多的空闲块。如果收到的指针的标头指向最后一块,而前一块是空的,我们将标头指针移动到它。我们重复这个过程,直到达到一个可用的块(如果是第一块,它是第一块) NULL)。然后,我们实施了堆减过程:

if(标题==最后){
  while ((标题->上一个!= NULL) && 标题->上一个->可用) {
    标题=标题->上一页;
  }
  最后=标题->上一个;
  brk(标头);
} 别的 {

现在,我们需要修理 abfree() 其中一个错误。根据规范,free() 函数应接受空指针,不执行任何操作。但是,如果 abfree() 接收到 NULL,我们会有分段错误!幸运的是,在函数开始时添加检查很容易修复:

void abfree(void *ptr) {
   如果(ptr == NULL){
     返回;
   }
   标头 *标头 = (标头*) ptr - 1;

所以,这就是我们现在的 abfree() 函数:

void abfree(void *ptr) {
   如果(ptr == NULL){
     返回;
   }
   标头 *标头 = (标头*) ptr - 1;
   假如(标题==最后){
     while ((标题->上一个!= NULL) && 标题->上一个->可用) {
       标题=标题->上一页;
     }
     最后=标题->上一个;
     brk(标头);
   } 别的 {
     标头->可用= true;
   }
 }

减少堆的大小是一个简单的优化,但仍然存在挑战。在下一篇文章中,我们将讨论如何避免为小请求重复使用非常大的内存块。

(这篇文章是 Implementando malloc() e free() — reduzindo ainda mais o heap 翻译,首次发表 Suspens?o de Descren?a。)

以上就是实现 malloc() 和 free() — 进一步减少堆的详细内容,请关注其他相关文章!


p

最新文章

  • 品质卓越,力荐这几款顶尖免费虚拟主机!

  • 实现 malloc() 和 free() — 进一步减少堆-C

  • 服务器架构:核心基石,支撑高效运算与存储

  • 云服务器:高效灵活,本地难及;本地受限,云上无界

  • 我最近正在开发一种使用方法 go 编写的 cli 最近使用了工具 cobra 工具,我有一个用例,我需要其中一个命令的嵌套提示。我用它 promptui 作为一个提示,没有直接的方法来执行这个操作。本文将展示如何使用promptui。 创建嵌套提示。在这里可以找到完整的代码。

    首先,我们需要创建一个空的Go项目。我们称之为嵌套提示:

    $ mkdir 嵌套提示 && cd 嵌套提示
    $ go mod init <a style="color:#f60; text-decoration:underline;" href="https://www.php.cn/zt/15841.html" target="_blank">git</a>hub.com//Thwani47/////nested-prompt 
    
  • 实现 malloc() 和 free() — 将元数据添加到内存块中-C

  • 智能考勤新纪元,线上打卡高效无忧!

  • 相关文章

  • 我最近正在开发一种使用方法 go 编写的 cli 最近使用了工具 cobra 工具,我有一个用例,我需要其中一个命令的嵌套提示。我用它 promptui 作为一个提示,没有直接的方法来执行这个操作。本文将展示如何使用promptui。 创建嵌套提示。在这里可以找到完整的代码。

    首先,我们需要创建一个空的Go项目。我们称之为嵌套提示:

    $ mkdir 嵌套提示 &amp;&amp; cd 嵌套提示
    $ go mod init <a styl

  • 实现 malloc() 和 free() — 将元数据添加到内存块中-C

  • 整数溢出-C

  • 踏上为期一年的软件工程之旅:从 C 到 Python、JavaScript、Node.js、DevOps 等-C

  • 《王者荣耀》元流之子上线时间介绍-手机游戏策略

  • “最强祖师”升级专业技能道具介绍-手机游戏策略

  • 最强祖师后勤弟子招募策略-手机游戏策略

  • 南宫婉最强祖师的技能强度和玩法策略-手机游戏策略

  • “绝区零”体力使用策略-手机游戏策略

  • 阴阳师禅心云外镜新皮肤获取策略-手机游戏策略

  • 如何抗腐蚀不朽之旅 《不朽之旅》腐化装备保障机制介绍-手机游戏策略

  • 《地下城与勇士:起源》女鬼剑上线时间详解-手机游戏策略