从编译器角度来看内存分三种情况:
1 系统初始化时都已经确定好、不会再变动的内存区域,一般指的是全局变量、静态变量数组等。
2 栈上内存:一般指的是函数内部的局部变量等,函数调用时分配内存,调用结束后系统自动释放不用自己考虑回收,效率高。有时候栈需要自己设定,设定不当可造成栈溢出。
3 堆上内存:即用动态分配函数分配的内存属于堆上内存,适合那些有MMU(内存管理)、开始不确定需要申请多大内存的场合。注意:利用动态分配内存函数,使用完毕要及时释放内存和将指针清0,否则容易产生野指针和内存泄露。因为系统不负责释放。同时频繁调用还容易造成内存随便,需要涉及内存碎片整理和回收算法。
虚拟内存和直接操作内存:
嵌入式系统一般资源有限,通常开发者直接对内存分区,对内存操作需要开发者对内存的整体使用情况有了解。ucos在系统初始化时先将内存分为几个固定大小的缓冲池,任务申请内存从某个缓冲池中申请内存,用完后释放回内存池。
PC机一般资源丰富,上层应用程序开发者通过虚拟内存来操作,屏蔽底层的实际物理内存地址。
指针 数组和栈:
指针是语言工具,动态分配函数都通过指针来操作。
数组和栈都属于数据结构。对于数据量小且固定的可以使用静态存储结构的数组;函数调用一般是栈的操作,注意堆栈的设置要合理。避免堆栈深度不足,造成调用时参数丢失;堆栈深度过深,效率变低。