动态内存分配

✍ dations ◷ 2025-11-26 19:52:33 #内存管理

在计算机科学中, 动态内存分配(Dynamic memory allocation)又称为堆内存分配,是指计算机程序在运行期中分配使用内存。它可以当成是一种分配有限内存资源所有权的方法。

动态分配的内存在被程序员明确释放或被垃圾回收之前一直有效。与静态内存分配的区别在于没有一个固定的生存期。这样被分配的对象称之为有一个“动态生存期”。

分配过程包括寻找一块足够大未被使用的内存。

通常,内存是从一个被称为堆的内存池中分配出来的。高级语言封装了内存地址的概念,内存通常是通过指针来间接访问的。分配算法经常将组织分配释放组块等操作封装成抽象的接口供上层函数调用。

堆分配的效率与分配算法的优劣关系很大。

定长分配通常被称为内存池分配,使用一个链表来保存空闲内存块信息(通常每块内存大小相同)。这种方法在简单的嵌入式系统中效果很好。

在这种分配方式下,内存从一个2的N次幂大的内存块中分配。当内存块比要分配的长度大两倍以上,内存块平均分裂成两块。选中其中一半,重复这个过程(检查长度,满足条件则分裂)直到内存块刚好等于需要的长度。

所有的块信息保存在一个排序过的链表或者二叉树中。当一个块被释放的时候与他的相邻块进行比较。如果他们都被释放,就合并成一个大块放进更大的一个块列表中。每当分配结束,分配器会从尽量小的块重新开始分配,以避免产生不必要的碎片。

相关

  • 大洋洲大洋洲(英语:Oceania),是指地缘政治学,将澳大利亚洲与太平洋诸岛屿并称的地理区域,大洋洲并不是地质学上严格意义的“大洲”,占全球总陆地面积的6%。在4万至12万5千年前,澳大利亚土
  • 21人类的21号染色体是23对染色体的其中之一,正常状况下每个细胞拥有两条。此染色体是所有人类染色体中最小的一个,含有大约4700万个碱基对,占细胞内所有DNA的1.5%。21号染色体的
  • AD基督纪年,又称为主历,是源自于基督教的纪年方法,以耶稣诞生年作为纪年的开始。在儒略历与格里高利历中,在耶稣诞生之后的纪年,称为主的年份(拉丁语:Anno Domini,缩写为A.D.;又译为主
  • 法国踢腿术法国踢腿术,又称萨瓦特(法语:Savate,法语发音:.mw-parser-output .IPA{font-family:"Charis SIL","Doulos SIL","Linux Libertine","Segoe UI","Lucida Sans Unicode","Code2000"
  • 巴勒斯坦地区巴勒斯坦(希腊语:Παλαιστίνη;阿拉伯语:فلسطين‎;希伯来语:.mw-parser-output .script-hebrew,.mw-parser-output .script-Hebr{font-size:1.15em;font-family:"Ez
  • 海岸岸(又称滨),分为海岸、湖岸及河岸,是在水面和陆地接触处,经波浪、潮汐、海流等作用下形成的滨水地带,其中有众多沉积物堆积而形成的岸称为滩。可分为岩岸与沙岸。沙岸海岸线平直而
  • 算经十书《算经十书》是指中国汉、唐时期遗留下来的十部重要数学书籍的一个总称。明初严恭在《通源算法》称之为“十经”,明末程大位《算法统宗》称之为“十书”。清代戴震校勘,交亲家
  • 阿里·卡菲阿里·侯赛因·卡菲(阿拉伯语:علي حسين كافي‎,Ali Hussain Kafi,1928年10月7日-2013年4月16日),前阿尔及利亚最高国务委员会主席,前主席穆罕默德·布迪亚夫被暗杀四天后
  • 严贞严贞,字宗正,号蕉窗,浙江奉化县人。明朝政治人物。永乐十六年(1418年)戊戌科进士,授刑部主事,升郎中,迁两淮监运司,改福建运使。天顺年间,官至云南右布政使,致仕卒,年七十九。有《蕉窗集
  • 尼特族尼特族(英语:NEET,全称Not in Employment, Education or Training)是指不就业、不安排就学、不进修或不参加就业辅导的年轻人。尼特族一词最早出现于英国,之后其他国家也开始使用