【C深度解剖】计算机数据下载和删除原理
简介:本系列博客为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函数。
未覆盖数据之前,还可以看到原本的值:


然后最后再说一点,就是函数返回值与函数返回值的接收,是独立的。
完。
相关文章:
【C深度解剖】计算机数据下载和删除原理
简介:本系列博客为C深度解剖系列内容,以某个点为中心进行相关详细拓展 适宜人群:已大体了解C语法同学 作者留言:本博客相关内容如需转载请注明出处,本人学疏才浅,难免存在些许错误,望留言指正 作…...
ASTORS国土安全奖:ManageEngine AD360荣获银奖
美国安全今日(AST)的年度“ASTORS”国土安全奖计划是一个备受瞩目的活动,致力于突显国土安全领域的创新与进步。这一奖项旨在表彰在保护国家免受安全威胁方面做出卓越贡献的个人和组织。该计划汇聚了执法、公共安全和行业领袖,不仅…...
clang--cpplint--gitlint
clang_format clang_format是什么 代码格式化工具 clang_format 官网和官网教程 中文教程 下载 sudo apt install clang sudo apt install clang-format#查看下载是否成功 clang --version 代码的构建到提交的过程: cmake .. make make test make clang_f…...
Web开发8:前后端分离开发
在现代的 Web 开发中,前后端分离开发已经成为了一种常见的架构模式。它的优势在于前端和后端可以独立开发,互不干扰,同时也提供了更好的可扩展性和灵活性。本篇博客将介绍前后端分离开发的概念、优势以及如何实现。 什么是前后端分离开发&am…...
基于 java+springboot+mybatis电影售票网站管理系统前台+后台设计和实现
基于 javaspringbootmybatis电影售票网站管理系统前台后台设计和实现 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承…...
【INTEL(ALTERA)】错误:*.onchip_flash_0:UFM 扇区不支持“隐藏”模式。请更新访问模式设置
说明 由于英特尔 Quartus Prime Standard Edition 软件版本 22.1 存在一个问题,当您针对 10 FPGA Compact 变体英特尔 MAX在片上闪存英特尔 FPGA IP中选择单压缩映像配置模式时,可能会出现以下错误消息。 错误:*.onchip_flash_0:…...
备战蓝桥杯---数据结构与STL应用(基础3)
今天我们主要介绍的是pair,string,set,map pair:我们可以把它当作一个结构体: void solve(){pair<int int> a;//创建amake_pair(1,2);//添加元素cout<<a.first<<endl<<a.second<<endl;}//输出 当然,它也可以嵌套&#…...
「优选算法刷题」:只出现一次的数字Ⅲ
一、题目 给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。 示例 1: …...
Vue-43、Vue中组件自定义事件
1、给学生绑定atguigu事件 2、在组件内触发事件 第二种写法 传多个参数。 解绑 解绑一个事件 解绑多个自定义事件 this.$off([xxx1,xxx2]);解绑所有事件 this.$off();总结...
GitHub 开启 2FA 双重身份验证的方法
为什么要开启 2FA 自2023年3月13日起,我们登录 GitHub 都会看到一个要求 Enable 2FA 的重要提示,具体如下: GitHub users are now required to enable two-factor authentication as an additional security measure. Your activity on GitHub includes you in this requi…...
ASP.NET Core 过滤器 使用依赖项注入
过滤器是 ASP.NET Core 中的特殊组件,允许我们在请求管道的特定阶段控制请求的执行。这些过滤器在中间件执行后以及 MVC 中间件匹配路由并调用特定操作时发挥作用。 简而言之,过滤器提供了一种在操作级别自定义应用程序行为的方法。它们就像检查点&#…...
2024年的网创之路应该这样走才对
2024年的网创之路应该这样走才对 大家都知道这两年经济环境不好,钱不好挣,对于普通人,只有一条出路,就是学某项技能,然后死磕,不能提升某项技能的项目,打死也不做,因为多数项目都是…...
ssh异常报错:Did not receive identification string from
一、问题描述 某次外出在异地工作场所xshell炼乳远程服务器时,报错:Connection closed by foreign host. D,服务器查看secure日志或sshd服务状态会显示:id not receive identification string from client_ip; 二、分析处理 1&a…...
MIDI码深度解析
MIDI 协议即数字音乐接口(Musical Instrument Digital Interface),是电子乐器、合成器等演奏设备之间的一种即时通信协议,用于硬件之间的实时演奏数据传递。如果理解还不够深刻,官方如下解释: 常用midi硬件…...
小红书如何做混部?
作者:宋泽辉(小红书)、张佐玮(阿里云) 编者按: Koordinator 是一个开源项目,是基于阿里巴巴内部多年容器调度、混部实践经验孵化诞生,是行业首个生产可用、面向大规模场景的开源混…...
[PHP]严格类型
PHP: 类型声明 - Manual...
作为程序员,你必须学会Maven
资源领取在末尾. Maven 是一款旨在简化 Java 开发流程的管理工具,它的主要功能包括: 1. 项目管理:Maven 提供了一种项目对象模型(Project Object Model, POM),用于管理项目的构建、报告和文档。它允许开发者通过少量代码…...
UDF学习(三)数据访问宏
数据访问宏一 网格节点相关宏** NODE_X (v) 节点v的x方向的坐标 (Node *v) NODE_Y (v) 节点v的y方向的坐标 (Node *v) NODE_Z (v) 节点v的z方向的坐标 (Node *v) F_NODE (f,t,n) 获取节点 (face_t f, Thread *t, int n 节点索引号) F_NNODES(f,t) 获取面上的节点数量 (…...
Web3技术革新:重新定义在线体验
互联网的不断演进塑造了我们的数字生活,而Web3技术的涌现正带来一场前所未有的变革。本文将深入探讨Web3技术的创新,以及它如何重新定义和提升我们的在线体验。 Web3技术的基本概念 Web3是互联网的第三个时代,它将去中心化、区块链、智能合约…...
从前端Vue到后端Spring Boot:接收JSON数据的正确姿势
目录 一、前端Vue发送JSON数据二、后端Spring Boot接收JSON数据三、常见错误和问题四、总结 在现代Web开发中,前后端分离已成为一种趋势,Vue和Spring Boot也成为了其中最流行的前后端框架。在Vue前端向Spring Boot后端发送数据时,常常需要将数…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
