2.C语言------程序运行为什么需要内存2

C语言------程序运行为什么需要内存(二)

1、代码就是函数。C语言中全局变量和局部变量就是数据。

2、在运行应用程序时,所有应用程序的代码和数据都在DRAM中就是冯诺依曼结构。

3、在单片机中将程序烧写到Flash(NorFlash)中,然后程序在Flash中运行。如果程序运行过程中不需要处理数据,那么这个这个程序也就不需要内存。程序中涉及到的数据(全局变量或局部变量)不能再Flash中必须放到RAM(SRAM:内存)中。CPU从Flash中读取程序并运行该程序,Flash中的程序只会被读取不会被改写和操作,在RAM(SRAM)中进行改写和操作。

总结:

冯诺依曼结构:代码和数据放在一个区域

哈佛     结构:代码和数据放在不同区域(代码在Flash中,数据在内存(SRAM)中)

动态内存DRAM和静态内存SRAM

1、内存在程序的执行过程中(内存中存储的内容)是有变化的。

2、静态的内存使用的是栈空间内存,不用程序员自己来分配。因为静态变量占用的存储空间对于编译器而言是可预计的,静态内存只需要编程的时候直接声明就可以了。与之相反动态内存则需要由程序员根据需要来自己分配并收回,动态内存是因为要执行一些因为外部请求而浮动占用内存的应用,所以动态的内存分配时候会用new关键字或malloc或calloc函数,之所以要程序员自己来分配内存是由于有时候不能确定程序要使用多少内存(http://baike.baidu.com/link?url=yIXLr0THYLO0oRukawM2ItR82U3Zi-NRTb6jU8IN_2qsiUspldoMCLyuTQiAgHSgP24Xw9M2DyJEWhEIwbP0tq)。用户无法确定空间大小,或者空间太大,栈上无法分配时,会采用动态内存分配。

3、内存是用来存储可变化数据的,数据在程序中表现为全局变量、局部变量等(gcc中常量也是存储在内存中的,大部分单片机中常量存储在Flash中也就是代码段中)。

4、内存对程序来说是本质的需求,越简单的程序需要的内存也就越少,而越复杂的程序需要的内存也就越多。因此内存管理是程序管理的重点。

5、数据结构是研究数据如何组织的,而数据又是放在内存中的。算法是为了更有效的加工数据,既然有数据就离不开内存。

6、在写程序是如果内存管理不善,可能导致程序运行时消耗过多的内存,这样内存就早晚会被吃光。当没有可用内存的时候程序就会崩溃,所以内存对程序来说是一种资源。

7、从操作系统角度来看:操作系统掌握所有硬件的内存,因为内存很大,所以操作系统将内存分成一个一个的页面(也就是一块一般是4kb)然后在以页面为单位管理。页面内以更细小的方式来管理内存(如字节),操作系统管理内存非常麻烦,但是对于使用操作系统的人来说并不需要知道是如何管理的。操作系统给我们提供了内存管理的一些接口,通过API就可以对内存进行管理(如C语言中的malloc和free来管理内存)。

8、没有操作系统时:其实就是裸机程序,程序需要直接操作内存。编程者需要自己计算内存的使用和安排。

9、从语言角度来说:不同的语言提供了不同的操作接口。例如汇编语言根本没有任何内存管理的机制,内存管理完全依靠程序员自己。汇编语言中操作内存时直接使用内存地址(例如0xd002 0010)非常麻烦。C语言中编译器帮我们管理直接内存地址,通过编译器提供的变量名等来访问内存的。

10、操作系统下如果需要大片的内存可以通过API(malloc、free)来访问系统内存

11、裸机情况下:需要大片的内存需要定义数组等来解决(例如C++语言,C++语言对内存进一步封装可以用new来创建对象),创建对象的同时其实就是为对象分配内存,使用delete删除对象(其实就是释放内存),所以C++对内存的管理比C要容易些,但是C++中内存的管理还是靠程序员自己来做。如果只new不delete就会照成内存的泄露。

13、java/C#等语言:不直接操作内存而是通过虚拟机来操作内存,这样虚拟机作为程序员的代理帮程序员处理内存释放的工作,如果程序员申请了内存使用完忘记释放,那么虚拟机就会帮助释放内存但这也需要一定的代价的。

14、当对性能要求非常高时候(操作系统内核)就会用C/C++语言

15、当对开发速度要求非常高时候就会用java/C#等语言

时间: 2024-08-25 21:52:48

2.C语言------程序运行为什么需要内存2的相关文章

程序运行时的内存分配情况

以下内容来自<C++编程实战宝典> 变量和函数占用的内存是系统在程序运行时为程序分配的,但并不是所有的变量和函数都被分配在同一块内存区域中.对于一个C++程序来说,系统一般采用3种方式为程序分配内存,下面将分别介绍这3种方式. (1)从静态存储区域分配 这部分内存在程序编译的时候就已经分配好,并且这块内存在程序的整个运行期间都存在.例如在函数外定义的全局变量,以及在创建时使用static修饰符的变量.在该区域存储的内容一般是全局变量,其中存储在数据段中的全局变量通常已经被初始化. (2)在栈上

[Java]程序运行时的内存分配

本文出处:<Thinking in JAVA> 寄存器这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限,所以寄存器根据需求进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象(另一方面,C和C++允许你向编译器建议寄存器的分配方式). 堆栈位于通用RAM(随机访问存储器)中,但通过堆栈指针可以从处理器那里获得直接支持.堆栈指针若向下移动,则分配新的内存:若向上移动,则释放那些内存.这是一种快速有效的分配存储方法,仅次于寄存器.创建程序时,

用MAT分析JAVA程序运行时的内存使用情况

Java出现OutOfMemoryError或者发现Java应用程序占用的内存很异常,那么我们一般采用下面的步骤分析:A. 把Java应用程序使用的heap dump下来B. 使用Java heap分析工具,找出内存占用超出预期的嫌疑对象C. 根据情况,分析嫌疑对象和其他对象的引用关系.D. 分析程序的源代码,找出嫌疑对象数量过多的原因.以下面的代码为例: public class TObject { int[] arr = new int[20000]; } public class Test

c++程序运行时的内存分配《转》

C++中,内存分为5个区:堆.栈.自由存储区.全局/静态存储区和常量存储区. 1.栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区.通常存放局部变量.函数参数等. 2.堆:是由new分配的内存块,由程序员释放(编译器不管),一般一个new与一个delete对应,一个new[]与一个delete[]对应.如果程序员没有释放掉,资源将由操作系统在程序结束后自动回收 . 自由存储区:是由malloc等分配的内存块,和堆十分相似,用free来释放.(注意:堆和自由存储区其实不过是同一块区域,

实例分析C程序运行时的内存结构

先验知识 静态变量存储在静态存储区,局部变量存储在动态存储区(栈),代码存放在代码区 寄存器,EBP指向栈底,ESP指向栈顶,EIP指向正在执行指令的下一条指令,三个寄存器中保存的都是地址,32位系统,地址为4个字节即dword 所有写在函数定义里面的语句都编译成指令(驱动CPU) 实验代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <stdio.h> int fun(int a, int b); int m = 10; int main() {

程序运行过程的内存分析。

栈:自动分配连续的空间,后进先出.用于存放局部变量 Example:s1(局部变量.new出来以后放到堆里保存) s1中存放一个地址,指向堆中保存的对象,对象中的各种属性也各自存放一个地址,指向堆内方法区中所保存的代码.static变量以及常量池等.图例如下 堆:空间不连续.用于放置new出的对象 方法区:存放类的信息(代码).static变量.常量池(字符串常量)等. Example:student类信息:1.代码(属性.方法).2.static变量.3.常量池(字符串常量--等) .

程序运行时三种内存分配策略

按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求. 栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未

Java内存管理-程序运行过程(一)

勿在流沙住高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 相信在做Java开发的伙伴一定知道 JVM(Java Virtual Machine(Java虚拟机)!本系列会开启对JVM相关的知识的探索和总结,让我们一起踏入JVM的学习之旅中,去了解和发现更加精彩的Java世界! 正如奥古斯特·罗丹 说过:世界上不是缺少美,而是缺少发现美的眼睛.Java的世界也是如此! 本文地图: 1.什么是程序 在计算机领域当中,程序就是为了能够让计算机执行

程序编译后运行时的内存分配

原文地址不详,我的转载的来源:http://blog.sina.com.cn/s/blog_5420e0000101a0w1.html 一.编译时与运行时的内存情况 1.编译时不分配内存 编译时是不分配内存的.此时只是根据声明时的类型进行占位,到以后程序执行时分配内存才会正确.所以声明是给编译器看的,聪明的编译器能根据声明帮你识别错误. 2.运行时必分配内存 运行时程序是必须调到"内存"的.因为CPU(其中有多个寄存器)只与内存打交道的.程序在进入实际内存之前要首先分配物理内存. 3.