目录
在嵌入式平台部署算法,内存问题是不可避免的问题。主要有两方面:
1、节省内存;
2、STM32动态内存分配和回收的特殊性(需要程序员有效管理);
参考:
51CTO的课程《C语言内存管理精讲-高手进阶课》
常见内存使用错误:
1、内存申请未成功,就使用;
2、内存申请成功,但是未初始化;
3、内存初始化成功,但是访问越界;
4、忘记释放内存或者释放一部分(内存泄露);
/*
malloc:正常初始化
calloc:可以初始化为0
realloc:可以重新调整内存空间大小
*/
内存区分类:
1、栈区(stack),编译器自动分配和释放,包括局部变量、函数体中定义的变量、函数参数。生命周期随着定义而开始,随着函数的结束而结束。栈空间很小,而且栈空间大小由编译器确定,还可以更改,例如在windows的Visual Studio下是1M,超过会提示stack over。当在STM32 F4XX的时候由宏确定。系统分配的是连续的内存区域,速度快。
2、堆区(heap),需要程序员自己管理。堆空间和64/32位、编译器有关,受限于有效的虚拟内存。32位2G以内,64位128G以内。不连续的内存区域,速度慢,容易产生内存碎片(需要内存池)。
3、全局区(静态区),全局变量(main以外的变量)、static静态变量,地址连续。在程序结束的时候才释放。
4、常量区,最常用的是字符串常量。字符串在常量区。
char *p = "AAAA";//p在全局静态区,"AAAA"在常量区
int main()
{
char *p1 = "AAAA";//p1在栈区,"AAAA"在常量区,地址和p相同
char [] = "AAAA"; //p1在栈区,"AAAA"在栈区
};