C代码的内存区域

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013517122/article/details/82805061

一直以来, 从未深入理解内存中的代码段, 数据段, BSS段, 堆栈 …, 现在项目需要, 编译的代码大了一点点, flash/ram 不够, 需要优化代码, 因此需要先了解哪些是占 Flash空间, 哪些是占 Ram 空间之后. 才能对应进行优化, 东翻西找了一大堆资料后, 总算是整明白了, 整理成笔记, 方便自己也方便别人, 何乐而不为呢.

1. 名词-五大段

1.1. BSS段

BSS:(Block Started by Symbol), 用于存放代码中未初始化的全局变量的一段内存区域. 属于静态内存分配区.

1.2. 代码段

code/text: 用于可执行代码的一段内存区域, 该部分区域的大小在代码编译完成之后就已经确定, 并该段区域为只读(但有些MCU也允许可写, 很少见), 该段也会包含一些只读的变量, 如字符串常量就存放在该段中.

1.3. 数据段

data:用于存放代码中已初始化的全局变量, 静态变量(全局/局部)的一段内存区域. 属于静态内存分配区.

1.4. 堆

heap:堆是用于给运行中的程序动态分配使用的一段区域, 大小不固定, 可动态增加或减少(一般向上增长), 调用 malloc/free 函数负责分配和释放内存. 

1.5 栈

stack:栈是用于存放局部变量(不包括静态变量), 也用于在函数被调用时, 传递参数和返回值, 利用栈的先进先出特性, 用于中断时保存/恢复现场特别方便. 

2. 段在内存中的分布图

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u013517122/article/details/82805061