当前位置: 首页 > news >正文

【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深度解剖】计算机数据下载和删除原理

简介&#xff1a;本系列博客为C深度解剖系列内容&#xff0c;以某个点为中心进行相关详细拓展 适宜人群&#xff1a;已大体了解C语法同学 作者留言&#xff1a;本博客相关内容如需转载请注明出处&#xff0c;本人学疏才浅&#xff0c;难免存在些许错误&#xff0c;望留言指正 作…...

ASTORS国土安全奖:ManageEngine AD360荣获银奖

美国安全今日&#xff08;AST&#xff09;的年度“ASTORS”国土安全奖计划是一个备受瞩目的活动&#xff0c;致力于突显国土安全领域的创新与进步。这一奖项旨在表彰在保护国家免受安全威胁方面做出卓越贡献的个人和组织。该计划汇聚了执法、公共安全和行业领袖&#xff0c;不仅…...

clang--cpplint--gitlint

clang_format clang_format是什么 代码格式化工具 clang_format 官网和官网教程 中文教程 下载 sudo apt install clang sudo apt install clang-format#查看下载是否成功 clang --version 代码的构建到提交的过程&#xff1a; cmake .. make make test make clang_f…...

Web开发8:前后端分离开发

在现代的 Web 开发中&#xff0c;前后端分离开发已经成为了一种常见的架构模式。它的优势在于前端和后端可以独立开发&#xff0c;互不干扰&#xff0c;同时也提供了更好的可扩展性和灵活性。本篇博客将介绍前后端分离开发的概念、优势以及如何实现。 什么是前后端分离开发&am…...

基于 java+springboot+mybatis电影售票网站管理系统前台+后台设计和实现

基于 javaspringbootmybatis电影售票网站管理系统前台后台设计和实现 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承…...

【INTEL(ALTERA)】错误:*.onchip_flash_0:UFM 扇区不支持“隐藏”模式。请更新访问模式设置

说明 由于英特尔 Quartus Prime Standard Edition 软件版本 22.1 存在一个问题&#xff0c;当您针对 10 FPGA Compact 变体英特尔 MAX在片上闪存英特尔 FPGA IP中选择单压缩映像配置模式时&#xff0c;可能会出现以下错误消息。 错误&#xff1a;*.onchip_flash_0&#xff1a…...

备战蓝桥杯---数据结构与STL应用(基础3)

今天我们主要介绍的是pair,string,set,map pair:我们可以把它当作一个结构体&#xff1a; void solve(){pair<int int> a;//创建amake_pair(1,2);//添加元素cout<<a.first<<endl<<a.second<<endl;}//输出 当然&#xff0c;它也可以嵌套&#…...

「优选算法刷题」:只出现一次的数字Ⅲ

一、题目 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。 示例 1&#xff1a; …...

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 中的特殊组件&#xff0c;允许我们在请求管道的特定阶段控制请求的执行。这些过滤器在中间件执行后以及 MVC 中间件匹配路由并调用特定操作时发挥作用。 简而言之&#xff0c;过滤器提供了一种在操作级别自定义应用程序行为的方法。它们就像检查点&#…...

2024年的网创之路应该这样走才对

2024年的网创之路应该这样走才对 大家都知道这两年经济环境不好&#xff0c;钱不好挣&#xff0c;对于普通人&#xff0c;只有一条出路&#xff0c;就是学某项技能&#xff0c;然后死磕&#xff0c;不能提升某项技能的项目&#xff0c;打死也不做&#xff0c;因为多数项目都是…...

ssh异常报错:Did not receive identification string from

一、问题描述 某次外出在异地工作场所xshell炼乳远程服务器时&#xff0c;报错&#xff1a;Connection closed by foreign host. D&#xff0c;服务器查看secure日志或sshd服务状态会显示&#xff1a;id not receive identification string from client_ip; 二、分析处理 1&a…...

MIDI码深度解析

MIDI 协议即数字音乐接口&#xff08;Musical Instrument Digital Interface&#xff09;&#xff0c;是电子乐器、合成器等演奏设备之间的一种即时通信协议&#xff0c;用于硬件之间的实时演奏数据传递。如果理解还不够深刻&#xff0c;官方如下解释&#xff1a; 常用midi硬件…...

小红书如何做混部?

作者&#xff1a;宋泽辉&#xff08;小红书&#xff09;、张佐玮&#xff08;阿里云&#xff09; 编者按&#xff1a; Koordinator 是一个开源项目&#xff0c;是基于阿里巴巴内部多年容器调度、混部实践经验孵化诞生&#xff0c;是行业首个生产可用、面向大规模场景的开源混…...

[PHP]严格类型

PHP: 类型声明 - Manual...

作为程序员,你必须学会Maven

资源领取在末尾. Maven 是一款旨在简化 Java 开发流程的管理工具&#xff0c;它的主要功能包括&#xff1a; 1. 项目管理&#xff1a;Maven 提供了一种项目对象模型(Project Object Model, POM)&#xff0c;用于管理项目的构建、报告和文档。它允许开发者通过少量代码…...

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技术革新:重新定义在线体验

互联网的不断演进塑造了我们的数字生活&#xff0c;而Web3技术的涌现正带来一场前所未有的变革。本文将深入探讨Web3技术的创新&#xff0c;以及它如何重新定义和提升我们的在线体验。 Web3技术的基本概念 Web3是互联网的第三个时代&#xff0c;它将去中心化、区块链、智能合约…...

从前端Vue到后端Spring Boot:接收JSON数据的正确姿势

目录 一、前端Vue发送JSON数据二、后端Spring Boot接收JSON数据三、常见错误和问题四、总结 在现代Web开发中&#xff0c;前后端分离已成为一种趋势&#xff0c;Vue和Spring Boot也成为了其中最流行的前后端框架。在Vue前端向Spring Boot后端发送数据时&#xff0c;常常需要将数…...

保姆级教程:AI全身全息感知镜像部署,手把手教你实现543点动作捕捉

保姆级教程&#xff1a;AI全身全息感知镜像部署&#xff0c;手把手教你实现543点动作捕捉 1. 引言&#xff1a;全息感知技术的平民化革命 想象一下&#xff0c;只需一台普通电脑&#xff0c;就能实现电影级别的动作捕捉效果——这正是AI全身全息感知技术带来的变革。传统动作…...

PPSSPP模拟器:这款安卓psp模拟器如何让你在手机上畅玩PSP经典游戏

还记得小时候躲在被窝里玩《怪物猎人》《战神》《最终幻想》的日子吗&#xff1f;那台黑白相间的PSP掌机承载了无数人的青春回忆。如今&#xff0c;PSP早已停产&#xff0c;但那些经典游戏并没有消失——只要你有PPSSPP模拟器&#xff0c;就能在手机、电脑甚至平板上重新体验它…...

NotaGen古典音乐生成:5分钟快速上手,小白也能创作贝多芬风格钢琴曲

NotaGen古典音乐生成&#xff1a;5分钟快速上手&#xff0c;小白也能创作贝多芬风格钢琴曲 1. 前言&#xff1a;AI音乐创作新时代 想象一下&#xff0c;你坐在电脑前&#xff0c;轻点几下鼠标&#xff0c;就能生成一段贝多芬风格的钢琴曲。这不是科幻电影&#xff0c;而是Not…...

OpenClaw学术场景应用:Qwen3-32B镜像辅助论文数据处理

OpenClaw学术场景应用&#xff1a;Qwen3-32B镜像辅助论文数据处理 1. 为什么需要自动化论文数据处理&#xff1f; 作为一名经常需要处理实验数据的研究人员&#xff0c;我过去常常花费大量时间在Excel和Python之间来回切换。数据清洗、格式转换、异常值检测这些重复性工作不仅…...

Intv_AI_MK11大模型微调实战:使用自有数据定制专属AI

Intv_AI_MK11大模型微调实战&#xff1a;使用自有数据定制专属AI 1. 为什么需要微调大模型 想象一下&#xff0c;你买了一套高级西装&#xff0c;虽然剪裁精良&#xff0c;但总感觉少了点个人特色。大模型就像这套西装&#xff0c;通用性强但缺乏针对性。微调就是为它"量…...

中央空调组态王6.55版本脚本程序动画仿真系统

中央空调组态王脚本程序动画仿真系统&#xff0c;组态王6.55版本凌晨三点盯着组态王工程画面里的虚拟风机打哈欠时&#xff0c;突然发现温度曲线开始抽风——这大概就是每个做过工业组态的老哥都经历过的魔幻时刻。今天咱们要折腾的是中央空调系统的动画仿真&#xff0c;用组态…...

彻底搞懂ScheduledThreadPoolExecutor

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...

Echarts异步数据加载场景下,如何设计优雅的Loading动画以优化用户感知

1. 为什么需要优雅的Loading动画 当我们在网页中使用Echarts展示数据图表时&#xff0c;经常会遇到数据需要从服务器异步加载的情况。想象一下这样的场景&#xff1a;用户打开页面后&#xff0c;看到一个空白的坐标轴在那里"发呆"&#xff0c;既没有数据也没有任何提…...

OpenClaw健康助手:Qwen3-32B分析智能穿戴数据生成周报

OpenClaw健康助手&#xff1a;Qwen3-32B分析智能穿戴数据生成周报 1. 为什么需要本地化健康数据分析 去年我开始使用智能手环监测睡眠和运动数据&#xff0c;但很快发现一个问题&#xff1a;所有数据都要上传到厂商云端才能生成报告。作为医疗行业从业者&#xff0c;我深知健…...

【数据结构与算法】第24篇:哈夫曼树与哈夫曼编码

一、基本概念1.1 带权路径长度在二叉树中&#xff1a;路径长度&#xff1a;从一个节点到另一个节点经过的边数带权路径长度(WPL)&#xff1a;所有叶子节点的权重 路径长度 之和示例&#xff1a;text叶子节点&#xff1a;A(7), B(5), C(2), D(4)普通树&#xff1a;15/ \7 8/…...