为什么内存出问题了。电脑就黑屏。。。
发布网友
发布时间:2022-04-25 02:15
我来回答
共3个回答
热心网友
时间:2023-08-14 07:44
内存是干吗使的?
储存数据用的!
CPU使计算和寻址用的,他每一个状态只能表示一个数。就是说,CPU只能记住当前运行时的几个数据(其实,CPU可以说,能记住更多的数据,不过,单位是K byte,就是寄存器和多级缓存,相比内存以M byte为单位,就太小了。具体就太复杂了。我们,就简化一下,认为这个CPU是一个被切除了海马区域的人(大脑的海马区域,主管人的深层记忆),他只能记住当前的几个数字)。那么,这个叫CPU 人如何帮助电脑使用者处理烦杂的计算任务呢?
他有一个好的数据管家兼数据仓库,就是内存!CPU把当前暂时不用的数据,就放到内存中,当下一次需要的时候——CPU每进行一次运算,就向内存询问一下,他下次运算需要从什么地方取得数据。得到内存提供的消息后,CPU就从该地址提取出这个值,以进行合适的运算,并把结果放到合适的内存地址去。
为了存取数据方便,内存就做成和32位CPU相匹配的样子,也是以byte为基本的单位。就是说,CPU一次可以把4个byte的数据写进内存,也能读取出去!
想象一下,这是这么样一个场面:
有着几乎无数个插孔的巨大长条行的插座,和一个有4个角的插头(以byte为单位来看),简直是随便乱插,都可以!^_^
「图略」
之所以,CPU能自由的找到数据,是因为,这4个G的内存,一个被编好了号!32位CPU的每一种状态,就代表一个具体的byte,也就决定了其具体的“位置”——相对于其他内存。
我一个int类型的数据,可以用来表示人的年龄,中国的铁路总长。在计算机中,我还可以用来表示其他数据的“地址”!你CPU是32个bit,4个byte,我一个int也是32个bit,4个byte,你能通过这个数据找到某一个地址,那么我一个int也能把这个地址值保存起来!
保存的地址值的int数据类型是啥东西!
指针!
对,就是大名鼎鼎的指针!C语言中最伟大的变量类型!
指针是干吗使的?
就表示其他数据的在内存中的存放位置!
所以,你不管是输出sizeof(int*)还是输出sizeof(char*),又或输出sizeof(short*),甚至输出sizeof(float*)、sizeof(double*),都只能得到一个数字——4!!因为,我在一个由32位CPU管理的内存中,我必须要,而且只需要4个字节的空间,才能准确的保存一个地址值!
好,我们简单写一个C程序,然后看看这将会发生些什么事情,在CPU和内存中!
int main()
{
int a = 1; //1
int b = 2; //2
int c; //3
c = a + b; //4
}
我们把这个程序用编译器编译一下,就得到一个exe文件,然后我们双击这个程序,出现啥?
对,啥都没有出现!
其实,出现了一个黑黑的框,然后很快就消失了,一般人不会注意到。我也不会注意到。
那么在这个短暂瞬间,发生了什么事情呢?
当然不是“请听下回分解!”,我们马上说!
这个程序,要求,在内存中,开辟一个4个byte的空间,然后把数字1,写进去;然后紧紧挨着他的地方,再开辟4个字节的空间,把2写进去。着分别就是我们的int变量a和b了。然后,又沿同一个方向,再开辟4个字节的空间,这就是我们的变量c了。为了使CPU听起来方便——CPU虽然使老美造的,可是他可不懂英语,他只懂数字!我们,分别把这三个变量的起始地址,叫地址0,地址4,地址8;
然后将有一个加法运算,CPU将怎么做呢?他按照,exe文件给他的信息,把地址0开始,向后3个字节,共4个字节的值,一下就提取出来了(这个插头和插座真合适!4对4),放在自己的寄存器中(我们可怜的、没有了脑海马的CPU只能记住当前的几个数字!)再从地址4开始,取了4个字节的值出来。然后,放一起,做加法!
好吧,我们回顾一下,小学的竖式加法:
1
+ 2
----------
3
可是,电脑只懂得二进制,不懂十进制(估计CPU只有两只手指,而人有10只手指,我们再次可怜一下CPU同志)。
所以,写成这样:
00000000 00000000 00000000 00000001
+ 00000000 00000000 00000000 00000010
---------------------------------------------
00000000 00000000 00000000 00000011
(好累啊,那可是30多个0啊!)
然后,它把这结果,再写进c所在的地址8以及后面的连续3个位置,共4个byte中。
从这个简单的例子中,我们可以看出两见事情:
“数据”和“函数”是分开存放的!
“函数”中的操作也可以用一连串的数字来表示。
解释一下第二点:CPU能直接运算的操作就几种而已,加减乘除。然后是辅助功能,取值,写值,完全可以用固定的序列来表示。而,内存只不过记录一下中间计算结果还有最后的计算结果。所以,在计算机看来,代码既数据,数据既代码。函数的代码,也需要实际的内存来存储,所以,“函数指针”也就出来了!
函数指针其实还是一个需要4个byte空间的变量,其中保存了某个函数的起始地址。利用函数指针调用不同的函数,你就可以轻易的干不同的事情,并把结果保存到内存中,当需要的时候,就利用适当的输出方式,把结果显示到合适的媒体上,比如显示屏,比如打印到一张纸上,或者转换成语音从喇叭中放出来。
然后,我们简单说说C中的数组。
有了前面的基础,我们可以很容易的认识到,数组不过是一群连续储存的同类型变量而已!
比如:
int array[4] = {1, 2, 3, 4};
其实,就是在内存中连续开辟4×4个byte的空间,分别把数值1、2、3、4的二进制形式写进合适的地址。然后访问的时候,只需要知道存储数组array最开始的地址,以及下标——表示你将对第几个数据进行操作就可以了!
比方,你接着写:
array[2] = array[0] + array[1];
就表示先从array起,从0-3地址,取出其中的值,再从4-7地址,取一个值;相加后,把结果写入8-11地址。
最后,我们回到《魔兽》中。前面说,要确定3维世界中的一个点(也就是一个游戏角色的位置),需要至少3个数字,用术语说,就是“坐标”!
那么,如此精细的地图,你至少得用int类型变量来确定具体的位置。那么,就一共是12个byte!然后,你若仔细看游戏中的角色——惨了,要描述的东西太多了,简直是一箩筐的数据!
现在知道为什么《魔兽》忒耗内存了吧!
热心网友
时间:2023-08-14 07:45
内存是电脑中的主要部件,它是相对于外存而言的。我们平常使用的程序,如Windows操作系统、打字软件、游戏软件等,一般都是安装在硬盘等外存上的,但仅此是不能使用其功能的,必须把它们调入内存中运行,才能真正使用其功能,我们平时输入一段文字,或玩一个游戏,其实都是在内存中进行的。通常我们把要永久保存的、大量的数据存储在外存上,而把一些临时的或少量的数据和程序放在内存上,当然内存的好坏会直接影响电脑的运行速度。
热心网友
时间:2023-08-14 07:45
电脑经常黑屏,莫名其妙关机,极大可能是内存条故障哦!