当前位置: 首页 > 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;常常需要将数…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...