提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
我们常见的存储单元有什么区别和联系做个简单记录,行路至此,有感而发
一、内存种类
二、使用事项
ROM:嵌入式中常用的主控芯片,根据ROM特性,一般用于存储我们的厂商Bootloader、应用程序、应用内存区、加密数据域。
RAM:符合SRAM接口,读写速度快,我们程序所分配的堆、编译器自动使用的栈,都是在RAM内,同时设备启动后也会根据程序策略,按需将flash中的程序拷到RAM中运行;但在程序中会出现内存泄漏和内存压缩问题。
FLASH:环境特性不稳定,有擦写次数寿命,最小擦除单位为扇区,发生过擦时可能会影响所操作的扇区的相邻一片内存也挂掉,变成砖。
NAND FLASH:常用的设备有固态硬盘、U盘、SD卡,特点是擦写较NOR FLASH快的多,寿命高,且存储密度高,缺点是发生比特翻转的概率比NOR FLASH大的多,多用于存储大容量的数据,对存储的策略依赖较强;比较烂的产品体现就是,U盘、固态用用速度越来越慢,再严重的直接读不出数据,变成砖头。
三、数据存储
我们写一个C语言代码,程序中各个变量,数据分配的存储位置是不同的。
内存五大分区:
堆区(Heap):运行时程序new分配的,也就是应用程序申请的,由应用程序自行申请和释放。
栈区(Stack):运行时为保持信息临时申请的,结束后释放,例如函数的参数、内部申请的非静态变量等信息。
自由存储区:由malloc申请,free释放,系统层面管理。
全局和静态存储区:全局变量和静态变量分配的区域,是否初始化,分配会位置会不一样
常量存储区:存储常量,例如字符串、const修饰变量等等。
int K = 0; //全局初始化区
char *p1; //全局未初始化区
const int data = 10; //只读代码段
main()
{
int B; //栈区
const char a; //栈区
char str[] = "xyz"; //"xyz"在常量区,s在栈上。
char *p2; //栈区
char *p3 = "123456"; //123456\0";在常量区,p3在栈上。
static int c =0; //全局(静态)初始化区
p1 = (char *)malloc(10); //堆区
p2 = (char *)malloc(20); //堆区
strcpy(P2,"abcxyz"); //abcxyz在常量区
}
名称 | 区别 | 存储位置 |
---|---|---|
全局变量 | 具有全局作用域,只需在一个文件中定义,在包含其文件的源文件中都可以使用 ,一般用extern关键字申明即可 | 静态存储区,初始化且不为0的全局变量被保存在data数据段中;而未初始化或初始化为0的全局变量被保存在.bss数据段中 |
局部变量 | 具有局部作用域,程序运行期间,在其所存在函数被调用入栈时才会存在,函数调用完成后释放,因此一般局部变量存在于栈区 | 栈区 |
静态全局变量 | 具有全局作用域,由于static修饰的全局变量,只作用于定义它的文件中,两个不同的源文件都定义了相同名字的静态全局变量,它们是不同的变量 | 静态存储区,初始化且不为0的全局变量被保存在data数据段中;而未初始化或初始化为0的全局变量被保存在.bss数据段中 |
静态局部变量 | 具有局部作用域,初始化一次可以持续使用,只对定义它的函数可见,调用函数和函数结束不会重新对他进行初始化 | 静态存储区,初始化且不为0的全局变量被保存在data数据段中;而未初始化或初始化为0的全局变量被保存在.bss数据段中 |
注意:未初始化和未初始化变量一般还不一样
名称 | 区别 |
---|---|
初始化全局变量 | 存在于data数据段,有初始化值,作为强符号 |
未初始化全局变量 | 存在bss数据段,初始值为或者空串,作为若符号 |
未初始化局部变量 | 存在栈区,初始值是不确定的 |
连接器在连接目标文件的时候,如果遇到两个重名符号,会有以下处理规则:
1、如果有多个重名的强符号,则报错。
2、如果有一个强符号,多个弱符号,则以强符号为准。
3、如果没有强符号,但有多个重名的弱符号,则任选一个弱符号。
int K ;
void fun(void);
main()
{
while(1)
{
}
}
int k; //与第一行的K都初始化,则都为强符号(报错),与第一行的k都不初始则都为若符(任选一个),只有一个初始化(选初始化的值)
void fun(void)
{
int k = 2; //局部变量与全局变量同名,则屏蔽全局变量,优先使用局部变量
}
四、存储区域与内存分区的关系
代码段(CODE DATA):执行的机器码组成,存储在ROM。
只读数据段(RO DATA):存储程序中不可更改的数据,常量存储区属于这里,存储在ROM,例如const修饰全局变量
已初始化可读可写数据段(RW DATA):程序中已定义,并且进行初始化的数据,全局和静态存储区中已经初始化的数据在这里存储,既存储在ROM,又存储在RAM。
未初始化数据段(BSS):程序中已定义,并且未初始化的数据,全局和静态存储区中未初始化的数据在这里存储,存储在RAM内。
堆和栈:程序运行时,从RAM中申请分配的。
总结
以上参考其他博主原文加上自己的理解,就是今天要讲的内容,应当掌握基础知识对于以后学习也尤为重要。本文参考文章链接:
原文链接:https://blog.csdn.net/qq_41890114/article/details/122771229
如有错误,欢迎指正,原创不易,转载留名!