堆栈的概念在脑海里已经存在有一段时间了,今天就测试来整理下Heap堆。栈以后再说。
堆区不像全局变量和局部变量总是有指定的内存大小,它是为了在程序运行时动态分配内存而设定的一块区域。
在程序运行时需要一块特定大小的内存空间来使用的时候,那么可以先声明空间大小值,然后在程序运行时会在某个区域里划分指定大小的内存空间出来,这里所说的某个区域就是堆区。
堆内存通常用类似malloc,free的函数来分配内存大小和释放内存。
Malloc函数用来动态分配堆内存空间。成功分配空间后返回分配的内存地址指针。如果申请分配的空间大小大于堆的大小就返回NULL。
Free函数用来释放先前分配的空间(创建堆空间后一定要记得释放)。
动态分配内存的时候由于存在内存指针和内存大小的关系,可能会导致overhead,反复分配和注销空间的话也会发生fragment问题.
实现动态分配内存的方法有很多种,在IAR Compiler里使用最多的是dlmalloc方法。
看下面的例子
我们设定Heap的大小为512Byte,然后申请分配461byte空间。结果我们可以看到因为无法分配461Byte的空间导致返回NULL.
因为overhead导致最大只能使用460byte空间。
另外,由于overhead的原因,与一次性分配大空间内存相比,分多次来分配小一点内存空间,反而使我们能够使用的总内存空间更少。
下面的例子是每次分配10byte,结果第30次的时候就无法再分配内存了。计算一下总共也只分配了290byte。
而在第一个例子