精华内容
下载资源
问答
  • 内存中存放的有程序吗
    千次阅读
    2019-01-03 09:16:53

    1、计算机使用内存来记忆或存储计算时使用的数据

     

    · 计算机执行程序时,组成程序的指令和程序所操作的数据都必须存放在某个地方

    · 这个地方就是计算机的内存(也称为主存或随机访问存储器),类比人类的大脑,内存就是程序员的一切,非常重要

     

    注意:主存和RAM的区别

     

    2、组成计算机内存的单位是bit(位)。binary digit(二进制数字)

     

    8 bit(比特) = 1 byte (字节)

    10M带宽:10M bps( bit per second )

    内存分配方式 

    内存分配方式有三种: 

    (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 

    (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 

    (3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。 

     

    常见的内存错误及其对策 

    发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误,通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。有时用户怒气冲冲地把你找来,程序却没有发生任何问题,你一走,错误又发作了。 

    常见的内存错误及其对策如下: 

    • 内存分配未成功,却使用了它。 

    编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。

    • 内存分配虽然成功,但是尚未初始化就引用它。 

    犯这种错误主要有两个起因:一是没有初始化的观念;二是误以为内存的缺省初值全为零,导致引用初值错误(例如数组)。 

    内存的缺省初值究竟是什么并没有统一的标准,尽管有些时候为零值,我们宁可信其无不可信其有。所以无论用何种方式创建数组,都别忘了赋初值,即便是赋零值也不可省略,不要嫌麻烦。

    • 内存分配成功并且已经初始化,但操作越过了内存的边界。 

    例如在使用数组时经常发生下标“多1”或者“少1”的操作。特别是在for循环语句中,循环次数很容易搞错,导致数组操作越界。

    • 忘记了释放内存,造成内存泄露。 

    含有这种错误的函数每被调用一次就丢失一块内存。刚开始时系统的内存充足,你看不到错误。终有一次程序突然死掉,系统出现提示:内存耗尽。 

    动态内存的申请与释放必须配对,程序中malloc与free的使用次数一定要相同,否则肯定有错误(new/delete同理)。

    • 释放了内存却继续使用它。 

    有三种情况: 

    (1)程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面。 

    (2)函数的return语句写错了,注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。(return ?) 

    (3)使用free或delete释放了内存后,没有将指针设置为NULL。导致产生“野指针”。

    【规则1】用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。 

    【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。 

    【规则3】避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。 

    【规则4】动态内存的申请与释放必须配对,防止内存泄漏。 

    【规则5】用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。 

     

    · 动态内存会被自动释放吗? 

    函数体内的局部变量在函数结束时自动消亡。很多人误以为示例是正确的。理由是p是局部的指针变量,它消亡的时候会让它所指的动态内存一起完蛋。这是错觉!

    void Func(void)
    
    { 
    
    char p = (char ) malloc(100);
    
    // 动态内存会自动释放吗? 
    
    } 

    我们发现指针有一些“似是而非”的特征:

     

    (1)指针消亡了,并不表示它所指的内存会被自动释放。 

    (2)内存被释放了,并不表示指针会消亡或者成了NULL指针。 

    这表明释放内存并不是一件可以草率对待的事。也许有人不服气,一定要找出可以草率行事的理由: 

    如果程序终止了运行,一切指针都会消亡,动态内存会被操作系统回收。既然如此,在程序临终前,就可以不必释放内存、不必将指针设置为NULL了。终于可以偷懒而不会发生错误了吧? 想得美。如果别人把那段程序取出来用到其它地方怎么办? 

     

    ·  内存耗尽怎么办? 

    如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告内存申请失败。通常有三种方式处理“内存耗尽”问题。 

    (1)判断指针是否为NULL,如果是则马上用return语句终止本函数。例如: 

    void Func(void) 
    
    { 
            A *a = new A; 
    
            if(a == NULL) 
    
            { 
    
                    return; 
    
            } 
    
    … 
    
    }

    (2)判断指针是否为NULL,如果是则马上用exit(1)终止整个程序的运行。例如: 

    void Func(void) 
    
    { 
    
            A *a = new A; 
    
            if(a == NULL) 
    
            { 
    
            cout << “Memory Exhausted” << endl; 
    
            exit(1); 
    
            } 
    
    … 
    
    }

    (3)为new和malloc设置异常处理函数。例如Visual C++可以用_set_new_hander函数为new设置用户自己定义的异常处理函数,也可以让malloc享用与new相同的异常处理函数。

    上述(1)(2)方式使用最普遍。如果一个函数内有多处需要申请动态内存,那么方式(1)就显得力不从心(释放内存很麻烦),应该用方式(2)来处理。 很多人不忍心用exit(1),问:“不编写出错处理程序,让操作系统自己解决行不行?” 

    不行。如果发生“内存耗尽”这样的事情,一般说来应用程序已经无药可救。如果不用exit(1) 把坏程序杀死,它可能会害死操作系统。道理如同:如果不把歹徒击毙,歹徒在老死之前会犯下更多的罪。

    有一个很重要的现象要告诉大家。对于32位以上的应用程序而言,无论怎样使用malloc与new,几乎不可能导致“内存耗尽”。我在Windows 98下用Visual C++编写了测试程序,见示例。这个程序会无休止地运行下去,根本不会终止。因为32位操作系统支持“虚存”,内存用完了,自动用硬盘空间顶替。我只听到硬盘嘎吱嘎吱地响,Window 98已经累得对键盘、鼠标毫无反应。 我可以得出这么一个结论:对于32位以上的应用程序,“内存耗尽”错误处理程序毫无用处。这下可把Unix和Windows程序员们乐坏了:反正错误处理程序不起作用,我就不写了,省了很多麻烦。 必须强调:不加错误处理将导致程序的质量很差,千万不可因小失大。

    void main(void) 
    
    { 
    
            float *p = NULL; 
    
            while(TRUE) 
    
            { 
    
            p = new float[1000000]; 
    
            cout << “eat memory” << endl; 
    
            if(p==NULL) 
    
                   exit(1); 
    
            } 
    
    } 
    
    

     

    更多相关内容
  • 计算机用来存放程序和数据的部件是什么该部件官方称呼是外存储器,也叫外辅存储器,它是计算机专门用于长时间存放数据、程序的设备。外存储器对于电脑不可或缺,也是我们在配电脑的时候比较看重的部位...

    计算机里用于存放程序和数据的东西叫做外辅存储器,简称外存储其实,比如固态硬盘、机械硬盘、U盘、磁盘、光盘等等都属于外存储器。它们的作用就是用于存放大量的数据以及软件的,并且能够长期存放,而短期存放数据的则为内存。

    f42dad3529b447b592018eafb0de2225.png

    计算机中用来存放程序和数据的部件是什么

    该部件官方称呼是外存储器,也叫外辅存储器,它是计算机专门用于长时间存放数据、程序的设备。外存储器对于电脑不可或缺,也是我们在配电脑的时候比较看重的部位,它经历过不同的发展阶段,且产品的更迭速度较快。

    计算机外存储器有哪些

    1、硬盘

    首先就是硬盘,它分为机械硬盘、固态硬盘。在之前大部分电脑呢都使用的是机械硬盘,它的结构简单、价格便宜、性能稳定。而现在大部分配电脑时会选择固态硬盘,因为它的速度更快,使用寿命更长,且价格也慢慢降下来了。

    2、U盘

    其次是我们用到的U盘,它里面也可以存储程序、数据等等,并且它还可以与不同的计算机接口连接,方便携带超级好用。除U盘以外,移动硬盘的性质与它类似,作用也比较雷同。

    3、磁盘

    在计算机刚刚进入中国市场的时候,当时磁盘还是非常流行的,它也能存放数据以及程序,但容量比较有限,且容易损坏,虽然价格很便宜,但使用寿命不长,很快就被市场所淘汰。

    4、光盘

    后来人们会选择将程序、数据刻录在光盘当中,于是光盘也成为外存储器的一种,现在很多电脑配件的驱动程序就是用光盘存放的,购买的时候可直接用光盘安装驱动程序,但它现在用得也非常少了,原因是不方便携带。

    展开全文
  • 1、bss是英文block started by symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0。bss段属于静态内存分配。它的初始值也是由用户自己定义的连接定位文件所确定,用户...

    原文地址:https://www.cnblogs.com/dylancao/p/9936957.html

     先看几个概念:

    1、bss是英文block started by symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0。bss段属于静态内存分配。它的初始值也是由用户自己定义的连接定位文件所确定,用户应该将它定义在可读写的ram区内,源程序中使用malloc分配的内存就是这一块,它不是根据data大小确定,主要由程序中同时分配内存最大值所确定,不过如果超出了范围,也就是分配失败,可以等空间释放之后再分配。

     2、text段是程序代码段,在at91库中是表示程序段的大小,它是由编译器在编译连接时自动计算的,当你在链接定位文件中将该符号放置在代码段后,那么该符号表示的值就是代码段大小,编译连接时,该符号所代表的值会自动代入到源程序中。

     3、data包含静态初始化的数据,所以有初值的全局变量和static变量在data区。段的起始位置也是由连接定位文件所确定,大小在编译连接时自动分配,它和你的程序大小没有关系,但和程序使用到的全局变量,常量数量相关。

     4、stack保存函数的局部变量和参数。是一种“后进先出”(last in first out,lifo)的数据结构,这意味着最后放到栈上的数据,将会是第一个从栈上移走的数据。对于哪些暂时存贮的信息,和不需要长时间保存的信息来说,lifo这种数据结构非常理想。在调用函数或过程后,系统通常会清除栈上保存的局部变量、函数调用信息及其它的信息。栈另外一个重要的特征是,它的地址空间“向下减少”,即当栈上保存的数据越多,栈的地址就越低。栈(stack)的顶部在可读写的ram区的最后。 

     5、heap保存函数内部动态分配内存,是另外一种用来保存程序信息的数据结构,更准确的说是保存程序的动态变量。堆是“先进先出”(first in first out,fifo)数据结构。它只允许在堆的一端插入数据,在另一端移走数据。堆的地址空间“向上增加”,即当堆上保存的数据越多,堆的地址就越高。

      遇到的问题:

      以前这些我都记得,今天遇到实际问题时候,发现远远不是这回事,全局变量能放在text段吗?

    的确可以的,其实,我今天就遇到了这种情况,这个配置的区域实际上是可以在link文件中修改的,假如我的link文件是这样子的:

      其实,这种情况下,假如我定义个const 类型的全局变量,该全局变量就会在text段了,看来,计算的的东西,还是要理解原理才行啊.不过,这个也是反复的过程,有谁不经过磨难,就能快速成长呢?

    展开全文
  • 计算机正在运行的程序存放在RAM(内存)里。RAM是与CPU进行沟通的桥梁;计算机所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。计算机正在运行的程序存放在RAM(内存)里。RAM是与CPU进行沟通...

    计算机正在运行的程序存放在RAM(内存)里。RAM是与CPU进行沟通的桥梁;计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。

    f08928ca560cc3a87ea1d97568687d37.png

    计算机正在运行的程序存放在RAM(内存)里。

    RAM是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。

    只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。

    组成:内存是由内存芯片、电路板、金手指等部分组成的。

    0181cc884a1beecf267c23c3c37038b3.png

    扩展资料:

    计算机运行程序:

    整个过程可以总结为编译、链接、装载、执行。

    1、编译

    编译过程又可以被分为两个阶段:编译、汇编。

    编译是指编译器读取字符流的源程序,对其进行词法与语法的分析,将高级语言指令转换为功能等效的汇编代码。

    汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。

    2、链接

    链接的主要内容是将各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接。

    3、装载

    程序在经过链接后,得到了可执行文件,下一步就需要将可执行程序加载到内存中。

    由于现代操作系统均采用分页的方式来管理内存,所以操作系统只需要读取可执行文件的文件头,之后建立起可执行文件到虚拟内存的映射关系,而不需要真正的将程序载入内存。

    4、运行

    加载器将可执行目标文件中的代码和数据从磁盘复制到内存中,然后通过跳转到程序的第一条指令或入口点来运行程序。

    展开全文
  • 当执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器,此过程称为“取指令”。与此同时,PC的地址或自动加1或由转移指针给出下一条指令的地址。此后经过分析指令,执行指令。完成第...
  • 实例详解C++程序的五大内存分区

    千次阅读 多人点赞 2021-10-25 19:42:58
    本文详细讲述C++程序在运行时的5大内存分区。 下面使用日常开发的编程实例,详细介绍一下这5个分区,以便大家能更深刻的理解这5大内存分区。 1、栈内存区 栈内存区是我们用的最多的分区,只要函数的地方...
  • 程序内存中的布局结构

    千次阅读 2019-04-21 14:07:07
    转自:https://my.oschina.net/pollybl1255/blog/140323,并根据自己的理解做了整理 参考: https://www.cnblogs.com/mfmdaoyou/p/6792665.html... ... BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变...
  • C++程序内存模型

    千次阅读 2022-04-27 22:34:09
    C++程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的 全局区:存放全局变量和静态变量以及常量 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等 堆区...
  • C语言局部变量和全局变量变量的存储类别(static,extern,auto,register) 1----局部变量和全局变量 在讨论函数的形参变量时曾经提到,形参...不仅对于形参变量,C语言所有的量都自己的作用域。变量说明的方式不同
  • 内存中以BUF单元开始缓冲区连续存放着10个学生的分数,试编制程序统计其中90一100分、80一89分、60一79分及60分以下者各多少人,并把结果分别存放在S9、S8、S7和S6。 声明:本人使用Masm for Windows 2015...
  • 堆和栈的区别 (stack and heap)一般认为在c分为这几个存储区 1栈 - 编译器自动分配释放 2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3全局区(静态区),全局变量和静态变量的存储...
  • 实型数据在内存中存放形式

    万次阅读 2018-08-19 17:22:40
    1.实型数据在内存中存放形式 实型数据一般占4个字节(32位)内存空间。按指数形式存储。实数3.14159在内存中存放形式如下: + .314159 + 1  数符 小数部分 指...
  • 一维数组在内存中存放

    千次阅读 2018-04-04 19:51:20
    1 硬盘上不可能运行程序的,必须在内存中运行。2 低地址到高地址存储 3 数组元素通常也称为下标变量。4 在C语言,只能逐个地使用下标变量, 不能用一个语句输出整个数组5 int a[10]和t=a[6]分别是定义数组长度为...
  • 程序中各变量在内存中的位置

    千次阅读 2018-01-24 14:48:59
    主要给初学者介绍下,我们编写的程序中,我们的代码,全局变量和静态变量在内存中是怎么存放的,我们new或者malloc出来的变量,在内存中是怎么分配的, 全局变量,静态变量----存于数据区; 局部变量,...
  • 要点: 1.10个带符号字节 2.三个分支 需两个转移指令 DATA SEGMENT MEM DB 10 DUP(?) PLUS DB ? ZERO DB ? NEGO DB ? DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START:MOV AX,DATA ... JZ
  • 程序内存四区

    千次阅读 2018-08-09 19:38:37
    在C语言程序中: 代码在内存中进行执行的时候,我们粗略的将程序所占用的内存分为四个区域—-栈区,堆区,全局区,代码区,每个程序都唯一的四个内存区域.我们需要熟悉和了解各个区域的特性,例如存储什么类型的数据, ...
  • 读懂变量在程序中占用内存的大小对于程序优化具有非常大的好处,本篇文章将列出C语言中各类型变量在C语言程序中占用的内存大小,希望大家读完后能有所收获。
  • 程序中数据存放的位置

    千次阅读 2017-10-16 17:30:50
    基本上程序员在开始接触Linux编程时就大抵就都听过代码段、数据段等等概念,它们是各种数据存放的位置。通过objdump -h命令可以查看一个.o文件(已编译成二进制文件但未链接)的各个段: 1. 代码段(.txt)   ....
  • 上一篇文章简单整理了栈(stack), 堆(heap)...一、栈内存存放基本类型的变量,以及对象的引用值和函数主体,遵循先入后出的原则。栈内存在函数定义的一些基本类型的变量和对象的引用变量都在函数的栈内存分配。当...
  • 关于数组在内存中存放

    万次阅读 2015-09-04 20:49:16
    由腾讯的一个笔试题牵涉的知识点,自己之前没有接触过,就总结了一下: ...【解析】若在内存中,则数据可以”随机存取”,但内存数据被读取或写入时,所需要的时间与这段信息所在的位置无关.但是在读
  • JVM内存中各部分存放的内容

    千次阅读 2018-01-18 09:53:54
    虚拟机内存中主要有程序计数器、虚拟机栈、本地方法栈、堆和方法区。 程序计数器和虚拟机栈都是线程“私有”的内存程序计数器是一块比较下的内存空间,主要村放代码执行的位置。分支、循环、跳转、异常处理...
  • 这样,虽然指令和数据都是以0、1代码形式存在存储器,但CPU可以判断出在取指阶段访存取出的0、1代码是指令;在执行阶段访存取出的0、1代码是数据。 计算机区分指令和数据以下2种方法:  通过不同的时间段来...
  • C语言定义的静态变量存放在栈区,动态分配的内存空间位于堆区。 这题答案为 F 为大家科普一下知识 C语言局部变量存在栈里,全局变量存静态存储区。 局部变量在栈空间上分配,这个局部变量所在的函数被多次...
  • JVM各内存区域存放内容

    千次阅读 2018-10-04 11:33:18
    一、方法区存放内容: 1.类的全限定名(类的全路径名)。 2.类的直接超类的权全限定名(如果这个类是Object,则它没有超类)。 3.类的类型(类或接口)。 4.类的访问修饰符,public,abstract,final等。 5.类...
  • 计算机用于存放下一条要执行指令的地址的部件是程序计数器;程序计数器是用于存放下一条指令所在单元的地址的地方;程序计数器是计算机处理器的寄存器,它包含当前正在执行的指令的地址,当每个指令被获取,程序...
  • 程序在计算机是如何运行的?搞懂内存和CPU

    千次阅读 多人点赞 2020-03-07 21:54:20
    1.程序在计算机是如何运行的? 运算器 控制器 存储器 输入设备 输出设备 在计算机啊,保存信息主要靠存储器,而存储器又分为内部存储器和外部存储器,内部存储器就是内存了,而这个外部存储器主要就是磁盘...
  • 程序内存中的布局

    千次阅读 2017-08-06 14:00:57
    1、代码段代码段(code segment)存放程序执行的机器指令。通常情况下,代码段是可共享的,使其可共享的目的是,对于频繁被执行的程序,只需要在内存中有一份副本即可。代码段是只读的,使其只读的原因是

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 770,210
精华内容 308,084
关键字:

内存中存放的有程序吗