0
点赞
收藏
分享

微信扫一扫

关于内存的一些问题


一 内存

           内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。C语言中允许直接访问物理地址,能实现汇编语言的大部分功能,可以直接对硬件进行操作,通常CPU以字节为单位访问内存,为每一个存储单元顺序编号,这个编号被称为内存地址。其实内存也就是暂时存储程序以及数据的地方,比如当我们在使用WPS处理文稿时,当你在键盘上敲入字符时,它就被存入内存中,当你选择存盘时,内存中的数据才会被存入硬(磁)盘。对于虚拟内存,Windows中运用了虚拟内存[2]技术,即匀出一部分硬盘空间来充当内存使用,虚拟内存是Windows 为作为内存使用的一部分硬盘空间。虚拟内存在硬盘上其实就是为一个硕大无比的文件,文件名是PageFile.Sys,通常状态下是看不到的。必须关闭资源管理器对系统文件的保护功能才能看到这个文件。虚拟内存有时候也被称为是“页面文件”就是从这个文件的文件名中来的。

二 数据类型的存储

           C语言中的数据类型包含基本的数据类型,构造函数类型,指针类型,空类型(void)等

关于内存的一些问题_内存分配

  

三 对于C语言的内存分配

     C语言的内存分配区域主要有5个:

  (1)栈区:在执行函数时,函数内局部变量(不包含static变量).函数返回值的存储单元在栈区上创建,函数执行结束时为这些存储单元自动被释放。栈区内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

后面会介绍

,static变量。

  (4)常量区:整数常量.浮点型常量.字符型常量及字符串常量都分配在文字常量区,程序结束后有系统释放。

 后面有测试代码,证明windows下地址是由高到低

 

关于内存的一些问题_Java_02

实际上在linux中吧,这一块出现是以进程的内存映像引出的,进程的内存映像就是指内核在内存中如何存放可执行程序文件。在将程序转化为进程的过程中,操作系统可以讲可执行程序有硬盘复制到内存中。高地址存储了命令行参数和环境变量

关于内存的一些问题_可执行程序_03

可执行程序和内存映像的区别在于:可执行程序位于磁盘中而内存映像位于内存中;可执行程序没有堆栈,因为程序被加载到内存中才会分配堆栈:可执行程序是静态的.不变的,而内存映像 随着程序的执行是在动态变化的,例如,数据段随着程序的执行要存储新的变量,栈在函数调用时不断的变化。

 对于Java中的内存分配
       Java中对内存的分配是动态的,它采用面向对象的机制,采用运算符new为每个对象分配内存空间,而且,实际内存还会随程序运行情况而改变.程序运行中,每个, Java系统自动对内存进行扫描,对长期不用的空间作为”垃圾”进行收集,使得系统资源得到更充分地利用.按照这种机制,程序员不必关注内存管理问题,这使Java程序的编写变得简单明了,并且避免了了由于内存管理方面的差错而导致系统出问题.而C语言通过malloc()和free()这两个库函数来分别实现分配内在和释放内存空间的,C++语言中则通过运算符new和delete来分配和释放内存.在C和C++这仲机制中,程序员必须非常仔细地处理内存的使用问题.一方面,如果对己释放的内存再作释放或者对未曾分配的内存作释放,都会造成死机;而另一方面,如果对长期不用的或不再使用的内存不释放,则会浪费系统资源,甚至因此造成资源枯竭.

四 解释一些概念

        为什么在C语言如果自己malloc空间,那么就自己必须free释放空间,如果不free,那么就会造成内存泄露,所谓的内存泄露就是,程序猿开辟了一段空间,当用完之后,那段内存还存在,但是当再次开辟空间的时候,那块内存已经用不了(站着茅坑不拉翔),这样当程序运行过程中会使内存越用越小,甚至出现不够用的情况,只当程序运行结束时,程序猿手动申请的那段内存才会被释放掉。一般而言,系统在栈中自己开辟空间,速度快,效率高,而且系统在用完之后,会立即释放掉,就像局部变量,程序猿自己在堆中开辟空间,速度慢点,还要自己释放,Java就好一点,上面解释中有,我不在赘述。

       static 大家注意一下,因为这个是全局变量,这个可以自动初始化,举个列子  static int  i 就和static int i=0等价,

     

      关于windows下的内存是由高地址到低地址的,用下面的代码可以验证:

  

#include<stdio.h>
int main(void)
{
int x=5,a[4]={1,2,3,4};
int i;
for(i=0;i<=5;i++)
printf("%d \n",a[i]);
}

     这段代码一般情况下不会出错,除非你的电脑内存分配太乱,要是随便一扫的话,数组这出界了,但是a[5]的值还是存在的,a[5]=x=5;在数组中内存地址总是由低到高,但是最后输出a[5]=5=x,就可以说明windows环境下运行C语言内存分配时由高到底的,其实你也可以用到2个变量,输出地址查看

         

                

        



 

 





举报

相关推荐

0 条评论