当前位置:首页 » 编程软件 » 程序编译内存分布

程序编译内存分布

发布时间: 2025-02-18 02:48:59

㈠ C或C++程序编译时内存分为几个存储

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区
1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
3.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
4.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
5.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)

㈡ 一个程序编译完成后在内存中是如何存储的


如上所说,内存被分成 程序代码区、堆区、栈区 还有个全局数据区

1.程序代码区:存放你的全部代码

2.堆区:存放用new 申请的变量(如 int a = new int(5))

3.栈区;存放int = 5;之类的变量(必须放在函数中)

4.全局数据区:存放全局或静态变量,即定义在函数外的,或加上static的变量
(如:static int a = 5;)

㈢ 问一个较为老的问题,C++程序运行时内存分为几个区域

一个由C/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。程序结束时由编译器自动释放。

2、堆区(heap) — 在内存开辟另一块存储区域。一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static)—编译器编译时即分配内存。全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放

4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区—存放函数体的二进制代码。

㈣ 内存的分配方式有哪几种

内存的三种分配方式:
1. 从静态存储区分配:此时的内存在程序编译的时候已经分配好,并且在程序的整个运行期间都存在。全局变量,static变量等在此存储。
2. 在栈区分配:相关代码执行时创建,执行结束时被自动释放。局部变量在此存储。栈内存分配运算内置于处理器的指令集中,效率高,但容量有限。
3. 在堆区分配:动态分配内存。用new/malloc时开辟,delete/free时释放。生存期由用户指定,灵活。但有内存泄露等问题。

常见内存错误及对策
1. 内存分配未成功,却被使用。
对策:使用内存之前检查是否分配成功。用p!=NULL判断。
2. 内存分配成功,未初始化就被使用。
内存的缺省值没有统一的标准。大部分编译器以0作为初始值,但不完全是。
对策:内存初始化时赋初值。
3. 内存操作越界。
对策:只能是小心了。
4. 释放了内存,仍然使用。
(1) 使用显示delete和free的野指针。
对策:释放完内存,将指针置为NULL。
(2) 使用隐式delete和free的野指针。主要是指函数返回指向栈内存的指针或引用。
对策:当然是不要返回就可以了。
5. 未释放内存,导致内存泄露。
用new/malloc开辟了内存,没用delete/free释放.
对策:new和delete的个数一定相同;malloc和free的个数一定相同;new[]和[]delete一定对应。

㈤ 编译时分配内存和运行时分配内存

编译其实只是一个扫描过程,进行词法语法检查,代码优化而已,编译程序越好,程序运行的时候越高效。
我想你说的“编译时分配内存”是指“编译时赋初值”,它只是形成一个文本,检查无错误,并没有分配内存空间。

当你运行时,系统才把程序导入内存。一个进程(即运行中的程序)在主要包括以下五个分区:
栈、堆、bss、data、code

代码(编译后的二进制代码)放在code区,代码中生成的各种变量、常量按不同类型分别存放在其它四个区。系统依照代码顺序执行,然后依照代码方案改变或调用数据,这就是一个程序的运行过程。

㈥ C语言 + 单片机-内存分布详解

C语言内存分区示意图如下:

1. 代码区

2. 常量区

3. 全局(静态)区

.bss段

.data段

4. 堆区(heap)

调用函数参数size_t是分配的字节大小,返回值是一个void型的指针,该指针指向分配空间的首地址。参数是开辟的内存的首地址。

5. 栈区(stack)

在STM32中,内存分配如下:

1. 随机存储器—RAM

2. 只读存储器—ROM

STM32F103芯片的内部分区如下图所示。

编译程序完成后,可以看到编译后的大小信息,包括Code、RO-data、RW-data和ZI-data的大小。这有助于开发人员和嵌入式系统设计者更好地管理内存资源并确保程序在目标设备上正常运行。

Code:代码段,指程序由编译器生成的可执行的机器指令。

RO-data:数据段,指程序中的只读数据部分,包括常量、字符串、const定义的变量等。

RW-data:数据段,指初始化为“非0值“的可读写数据,程序运行的时候这些数据又会常驻在RAM区,应用程序可以修改其内容。包括初始化为非零的全局变量和静态变量。

ZI-data:数据段,指初始化为0值的可读可写数据,它与RW-data的区别是程序刚运行时这些数据初始值全都为0,程序运行时和RW-data的性质一样,它们也常驻在RAM区,应用程序可以更改其内容。包括未初始化和初始化为零的全局变量和静态变量。

ZI-data 的栈空间(Stack)及堆空间(Heap):在C语言中,函数内部定义的局部变量属于栈空间,而使用malloc动态分配的变量属于堆空间。在程序中的栈空间和堆空间都是属于ZI-data区域的,这些空间都会被初始值化为0值。

关于哪些数据存储在Flash区域,哪些数据存储在SRAM区域,这涉及到程序的存储状态。程序具有静止和运行两种状态,静止态的程序被存储在非易失存储器中,如内部FLASH区域。当程序在运行状态的时候,程序常常需要修改一些暂存数据,这些数据往往存放在Flash中,但需要被复制到RAM中。

程序存储分布如下图展示。当程序存储到芯片的内部FLASH时,它占用的空间为Code+RO-data+RW-data的总和。程序在执行的时候,需要占用内部SRAM空间,占用的空间为RW-data+ZI-data之和。

结论,想要让一个程序正常运行,必须满足以下两个条件:程序编译后打开工程的map文件,在map文件的最后一段也可以看到ROM的总大小。

划分依据及好处:首先区分代码段和数据段。程序源代码编译后的机器指令放在代码段;数据段包括" .data "、" .bss "、" .rodata ",将程序中定义的全局变量和局部变量都称为数据段。

把程序的“代码段”和“数据段”分开存放,数据和指令分别被映射到两个虚拟内存区域,数据段对进程是可读写的,而代码段对进程是只读的。现代CPU缓存设计成数据缓存和指令缓存分离,程序的指令和数据分开存放提高缓存命中率。

数据段还需要分 ".data"、".bss"、".rodata",主要根据是否占内存空间、读写权限进行区分。".data"段和".bss"段都是可读写的数据段,而".rodata"存放的是只读数据,主要是一些const变量和字符串常量。".rodata"段单独设立的好处是可以将属性映射成只读,减少修改操作,还可以将".rodata"段存放在只读存储器中。

全局变量也有细分初始化和未初始化,把全局变量分开存放,初始化为0和未初始化的全局变量放在BSS区,初始化不为0的全局变量存放在数据区。程序有两个存储状态,静止状态的程序被存储在非易失存储器中,运行状态的程序需要修改一些暂存数据存放在内存中,减少从ROM读数据的次数提高效率。

热点内容
基于arm的linux 发布:2025-03-04 22:08:30 浏览:586
安卓手机如何秒截屏 发布:2025-03-04 21:47:31 浏览:815
python财务数据分析 发布:2025-03-04 21:37:01 浏览:711
iphone访问限制密码初始 发布:2025-03-04 21:37:00 浏览:56
服务器伪装ip如何破解 发布:2025-03-04 21:25:54 浏览:1003
iphone6怎么解锁屏密码 发布:2025-03-04 21:21:38 浏览:136
微信少儿编程 发布:2025-03-04 21:12:45 浏览:194
lol服务器连不上怎么办 发布:2025-03-04 20:56:13 浏览:680
米侠里面的脚本有什么用 发布:2025-03-04 20:52:22 浏览:591
xmlmd5加密 发布:2025-03-04 20:52:22 浏览:813