有源码如何搭建网站,网页设计居中代码,海南网新闻最新消息今天,标书制作培训机构简介#xff1a;本系列博客为C深度解剖系列内容#xff0c;以某个点为中心进行相关详细拓展 适宜人群#xff1a;已大体了解C语法同学 作者留言#xff1a;本博客相关内容如需转载请注明出处#xff0c;本人学疏才浅#xff0c;难免存在些许错误#xff0c;望留言指正 作… 简介本系列博客为C深度解剖系列内容以某个点为中心进行相关详细拓展 适宜人群已大体了解C语法同学 作者留言本博客相关内容如需转载请注明出处本人学疏才浅难免存在些许错误望留言指正 作者博客链接睡觉待开机 下面是本节博客的大纲梳理
引言 在生活中我需要下载一个视频或者软件时候往往需要较长的时间相对来说但是我们如果删除相应的视频或者软件时候反而会很快相对来说这是为什么呢 这是一个比较奇特的现象在不懂的人看来。 下面针对该问题进行探讨为了便于大家理解我直接回答相关问题最后再做示例演示。
正文
答案计算机的数据下载需要把大量二进制数据进行拷贝。而计算机的数据删除本质上设置该数据无效即可无需清空数据。 1.数据下载与删除所需时间不同的原因
计算机数据的存入需要把相应数据全部复制到存储硬件内存、硬盘中进行存储也就是需要把该视频的音频数据图像数据的所有二进制文件全部拷贝到计算机中虽然计算机的处理速度很快但是一个大一点的电影就是十几个G再快也得几分钟才可以搞定。但是对于计算机而言删除数据并不会像我们想象那样需要把该视频文件全部回归初始状态而是计算机直接宣布放该视频的这块内存空间允许被其他内容覆盖。明白了这些自然数据下载很慢而数据删除很快了因为压根就没删。
为了便于大家理解我做一个比喻计算机的数据下载类似于我们盖一个新的大楼说起盖大楼要先打地基再向上一步一步搞总之非常麻烦。但是如果要拆除一座大楼呢写个拆字就行了。当然与之不同的是大楼拆除是会破坏原来大楼的结构的但是计算机为了效率的原因直接让那庞大的数据在那里就可以了便不再管了直到这块空间再次被使用才会覆盖为新的内容。
那这里其实大家就可以联想到为什么有些人建议不要卖掉你的手机或者电脑原因嘛上面的说明就是一个大概的一个情况具体这方面数据删除很复杂明白上面所说即可。
但是可能有人就想问了为啥计算机不把我们需要删除的内容进行修改防止个人信息泄露呢 一是为了效率问题如果要对删除内存空间进行初始化修改计算机估计要多一倍的工作量计算机是十分看重效率的这么做我想设计者也是为了追求效率吧。 二是为了减少计算机本身的硬件损耗这其实是硬件层面的知识了我也不太清楚只能说如果计算机对内存操作越频繁那么存储硬件损耗会越快我想这么做也是为了硬件寿命考量吧。 2.C语言中函数栈帧问题
了解到上面所讲的计算机对数据的下载和删除原理之后那么就可以联系到我们C语言中的函数栈帧了。我们知道我们C语言是由函数所构成的那么函数是在哪里进行存储的呢是在内存在具体而言是在内存栈空间。
这里就不得不提一下C程序地址空间的相关概念了这个C程序地址空间实际并不存在是为了便于我们理解人们所抽象出来的操作系统进程地址空间不是真正意义上的内存空间不是内存真正的空间。 每当我们C程序调用一个函数时候会预先给这个函数一块固定大小的空间让该函数中的变量在所给该函数的栈空间中开辟属于变量的内存空间。在函数调用开始时候操作系统会把我们计算机内存中的一块空间给我们某个函数使用一旦该函数调用结束那么就收回该空间。
我们一般称操作系统给函数的这块空间为栈帧。
有同学可能好奇为啥计算机知道要给这个函数分配多少空间啊我可以比较形象的解释一下这个问题因为计算机提前看了一眼你写的代码虽然没有执行但是大概知道你写的函数需要给多少空间啦。
总结下来就是调用函数形成栈帧结束函数释放栈帧同理这里释放栈帧只是允许其他内容覆盖该栈帧空间并不是真正意义上的删除原先数据。
那么实际上上面所说的内容可以回答两个问题 一是为啥局部变量具有临时性的问题原因很简单因为局部变量都是在函数内部进行定义的也就是说变量的存在依托于他所在函数的存在他函数所在空间都被收回了作为在里面的变量自然也就消失了。
为了大家理解我可以举个比喻性的例子就是古代西方国家与贵族的例子吧一个古代西方国家有一个国王还有一堆贵族组成函数在这里就类似于国家变量类似于贵族你说国家都灭亡了这个国家的贵族还能有吗哈哈对吧。这恰到好处的解释了为什么局部变量具有临时性的问题你可能会疑问那全局变量呢全局变量的空间开辟并不是在函数内完成而是跑到了全局数据区伴随着程序的消亡而消亡这又是另一个话题了。
二可以回答函数无限递归导致崩溃的问题也很好理解函数无限递归也就是说在第一个函数里调用第二个函数第二个函数里调用第三个函数…一直调用我们操作系统一直没有机会去收回我们函数的空间栈空间迟早有一天会被无限递归占满那么自然会导致栈溢出崩溃。 3.return数据与临时变量接收的本质
在C语言中有一个关键字叫return专门用来返回一个函数的返回值。我们说了一个函数调用结束便意味着消亡那么这个函数内的值是怎么返回到调用这个函数的函数中去的
为了便于大家理解我说的啥意思我直接给一个具体的例子
//如何正确理解这段代码
#include stdio.h
#include windows.h
char* show()
{
char str[] hello bit;
return str;
}
int main()
{
char *s show();
printf(%s\n, s);
system(pause);
return 0;
}实际上是借助了寄存器。 那么该如何验证呢需要看反汇编。 上面代码的结果是函数及时被销毁了但是如果数据没有被覆盖那么依然可以找到数据,但是如果被覆盖了那显示结果大概就是乱码了。 在这个例子中覆盖show函数数据的函数是printf函数。 未覆盖数据之前还可以看到原本的值
然后最后再说一点就是函数返回值与函数返回值的接收是独立的。 完。