欢迎光临散文网 会员登陆 & 注册

c语言动态内存分配的优缺点及注意事项

2023-03-22 14:03 作者:大方老师单片机课堂  | 我要投稿

在大多数常见情况下,C语言编译程序会将静态变量和全局变量采用静态内存分配。这些能够确定大小的内存会在程序启动时分配好,大多数会存在于一个抽象的概念“堆”当中。而确定长度的局部变量则会在函数被调用时在栈中预分配,随着函数的返回和超过其作用域时被“销毁”。

然而,在一些情况下,需要动态地申请内存,比如动态链表,因为链表的长度是不确定的。为了提高内存利用率,需要提供一个函数向操作系统、内存池或其他地方申请内存,申请多少使用多少,不再需要时将内存释放归还。

通常使用malloc函数申请的内存存在于堆中,而通过非标准拓展vla分配的内存大概率存在于栈中(部分实现也在堆里)。

然而,动态分配内存并不完美。首先,从逻辑实现来说,动态内存分配需要一个内存管理程序,记录内存的分配大小、释放节点、空余节点,甚至添加一堆调试信息,这些操作需要额外占用内存,因此,实际使用的物理内存会大于申请的内存空间。其次,频繁的不同长度的动态内存分配与释放可能造成内存碎片。例如,将一连串100字节内存分配出去,其中一块内存被释放了,然后又申请99字节内存。于是,有一个1字节内存夹在一大片连续内存中,因为太小而得不到充足的利用。当这种离散零碎的小空间越来越多时,就会导致越来越多的碎片内存因无法利用而浪费。因此,为了避免这种情况,往往会对申请内存进行对齐,实际分配内存大小会大于申请内存大小,从而增加内存利用率。

另外,现代操作系统中,为了物理内存的利用率、安全性和复用性,会结合硬件支持对内存进行段式、页式或段页式管理。在这种分配机制中,极端情况下,即使仅使用1字节内存,也可能占据整页内存,导致页内其他内存得不到利用而浪费。



刚好,我这里有C语言资料包,私信我领取

c语言动态内存分配的优缺点及注意事项的评论 (共 条)

分享到微博请遵守国家法律