2.C语言------程序运行为什么需要内存2
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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#等语言
以上是关于2.C语言------程序运行为什么需要内存2的主要内容,如果未能解决你的问题,请参考以下文章