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

C7.5【x86汇编】底层分析范围for的执行过程

目录

1.反汇编代码

2.分析

1.栈区初始化

2.设置数组元素的值

3. 逐条分析范围for

1.arr的地址被放到[ebp-2Ch]处

2.[ebp-2Ch]指向的值被复制一份到[ebp-30h]处

3.eax暂存[ebp-2Ch]指向的值,加28h后存储到[ebp-34h]处

4.跳转指令

5.比较[ebp-30h]和[ebp-34h]指向的值,如果相等则跳转到return 0;的反汇编指令

6.将数组元素的值载入ecx寄存器,再将其赋值给变量a

7. 跳转指令

 8.更新[ebp-30h]指向的值,每次执行都+4(原因:int类型的数组)

4.函数返回,空间释放

5.总结

几个重要参数

编译器为什么要这样设计汇编指令

3.范围for的核心思想


承接C7.【C++ Cont】范围for的使用和auto关键字文章的遗留任务

1.反汇编代码

#include <iostream>
using namespace std;
int main()
{push        ebp  mov         ebp,esp  sub         esp,78h  push        ebx  push        esi  push        edi  mov         ecx,offset _2A500742_leetcode@cpp call        @__CheckForDebuggerJustMyCode@4 nop  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };mov         dword ptr [arr],1  mov         dword ptr [ebp-24h],2  mov         dword ptr [ebp-20h],3  mov         dword ptr [ebp-1Ch],4  mov         dword ptr [ebp-18h],5  mov         dword ptr [ebp-14h],6  mov         dword ptr [ebp-10h],7  mov         dword ptr [ebp-0Ch],8  mov         dword ptr [ebp-8],9  mov         dword ptr [ebp-4],0Ah  for (int a : arr)lea         eax,[arr]  mov         dword ptr [ebp-2Ch],eax  mov         eax,dword ptr [ebp-2Ch]  mov         dword ptr [ebp-30h],eax  mov         eax,dword ptr [ebp-2Ch]  add         eax,28h  mov         dword ptr [ebp-34h],eax  jmp         main+7Ah mov         eax,dword ptr [ebp-30h]  add         eax,4  mov         dword ptr [ebp-30h],eax  mov         eax,dword ptr [ebp-30h]  cmp         eax,dword ptr [ebp-34h]  je          main+8Ch mov         eax,dword ptr [ebp-30h]  mov         ecx,dword ptr [eax]  mov         dword ptr [ebp-38h],ecx  {}jmp         main+71h  return 0;xor         eax,eax  
}pop         edi  pop         esi  pop         ebx  mov         esp,ebp  pop         ebp  ret

已知

jmp main+7Ah 跳转到add eax,4下方第一个mov eax,dword ptr [ebp-30h]

je main+8Ch 若符合条件,将跳转到xor eax,eax

jmp main+71h 跳转到add eax,4上方的mov eax,dword ptr [ebp-30h]

画图则为:

分析提示

汇编指令不能一条条看,需要有整体思想,按"指令块"的视角来看

2.分析

1.栈区初始化

 push        ebp  mov         ebp,esp  sub         esp,78h  push        ebx  push        esi  push        edi  mov         ecx,offset _2A500742_leetcode@cpp call        @__CheckForDebuggerJustMyCode@4 nop 

为常规操作,具体分析见36.【C语言】函数栈帧的创建和销毁文章,不再赘述

2.设置数组元素的值

 mov         dword ptr [arr],1  mov         dword ptr [ebp-24h],2  mov         dword ptr [ebp-20h],3  mov         dword ptr [ebp-1Ch],4  mov         dword ptr [ebp-18h],5  mov         dword ptr [ebp-14h],6  mov         dword ptr [ebp-10h],7  mov         dword ptr [ebp-0Ch],8  mov         dword ptr [ebp-8],9  mov         dword ptr [ebp-4],0Ah 

从0x01到0x0A,依次被写入内存

注意这里的ebp寄存器,其值存储数组最后一个元素下一个位置的地址,后面会有重要作用,有几个重要的参数都依赖于ebp寄存器

3. 逐条分析范围for

1.arr的地址被放到[ebp-2Ch]处

 lea         eax,[arr]  mov         dword ptr [ebp-2Ch],eax  

2.[ebp-2Ch]指向的值被复制一份到[ebp-30h]处

 mov         eax,dword ptr [ebp-2Ch]  mov         dword ptr [ebp-30h],eax 

3.eax暂存[ebp-2Ch]指向的值,加28h后存储到[ebp-34h]处

 mov         eax,dword ptr [ebp-2Ch]  add         eax,28h  mov         dword ptr [ebp-34h],eax  

eax原本存储arr数组的地址ebp-28h,现+28h

4.跳转指令

jmp         main+7Ah 

5.比较[ebp-30h]和[ebp-34h]指向的值,如果相等则跳转到return 0;的反汇编指令

 mov         eax,dword ptr [ebp-30h]  cmp         eax,dword ptr [ebp-34h]  je          main+8Ch 

显然不满足,按顺序执行

备注: je main+8Ch是唯一能退出条件循环的出口

6.将数组元素的值载入ecx寄存器,再将其赋值给变量a

 mov         eax,dword ptr [ebp-30h]  mov         ecx,dword ptr [eax]  mov         dword ptr [ebp-38h],ecx  

备注:变量a存储在[ebp-38h]处

不规范的写出前面两行汇编指令的等价指令mov ecx,dword ptr [[ebp-30h]] 

写成C代码的形式

eax = *(ebp-30h);
ecx = *eax;

两次解引用,相当于

ecx = **(ebp-30h);

7. 跳转指令

 jmp         main+71h  

 8.更新[ebp-30h]指向的值,每次执行都+4(原因:int类型的数组)

 mov         eax,dword ptr [ebp-30h]  add         eax,4  mov         dword ptr [ebp-30h],eax  

 ......多次条件循环直到[ebp-30h]和[ebp-34h]的值相等(数组元素全部遍历完了)才结束,跳转至return 0;

4.函数返回,空间释放

 pop         edi  pop         esi  pop         ebx  mov         esp,ebp  pop         ebp  ret

5.总结

几个重要参数

ebp寄存器:存储数组最后一个元素下一个位置的地址

[ebp-2Ch]指向的内存空间:存储arr数组首元素的地址

[ebp-30h]指向的内存空间:第一次存储arr数组首元素的地址,其后每次更新都+4

[ebp-34h]指向的内存空间:存储数组最后一个元素下一个位置的地址

[ebp-38h]指向的内存空间:存储变量a的值

★[ebp-30h]是决定能否退出条件循环的关键参数!

编译器为什么要这样设计汇编指令

遍历数组前需要准备开始位置(即初始索引)和结束位置(最后一个元素下一个位置的地址)

这两个数据需要内存空间去存储,因此用[ebp-2Ch]和[ebp-34h]暂时存储

还需要维护一个指针去逐个访问数组中的每个元素:因此用[ebp-30h]暂时存储

for (int a : arr)需要为a开辟内存空间,因此用[ebp-38h]暂时存储

3.范围for的核心思想

从头到尾遍历数组

相关文章:

C7.5【x86汇编】底层分析范围for的执行过程

目录 1.反汇编代码 2.分析 1.栈区初始化 2.设置数组元素的值 3. 逐条分析范围for 1.arr的地址被放到[ebp-2Ch]处 2.[ebp-2Ch]指向的值被复制一份到[ebp-30h]处 3.eax暂存[ebp-2Ch]指向的值,加28h后存储到[ebp-34h]处 4.跳转指令 5.比较[ebp-30h]和[ebp-34h]指向的值,…...

你听说过MIPS吗?它和ARM有何区别?

探索MX2000-B BGA核心版为何选用MIPS指令集的君正X2000处理器&#xff0c;MIPS相较于ARM有哪方面优势&#xff1f; 前段时间ZLG致远电子推出了MX2000-B BGA核心版&#xff0c;这款产品的核心芯片搭载了基于MIPS指令集的君正X2000处理器。有些工程师对于MIPS不怎么了解&#xff…...

SQL面试50题 数据库准备(存储过程)

数据表关系图 数据表 CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) NOT NULL,sex enum(female,male) NOT NULL,birth date NOT NULL,credit float(5,2) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT25 DEFAULT CHARSETutf8;…...

Github 基本使用学习笔记

1. 基本概念 1.1 一些名词 Repository&#xff08;仓库&#xff09; 用来存放代码&#xff0c;每个项目都有一个独立的仓库。 Star&#xff08;收藏&#xff09; 收藏你喜欢的项目&#xff0c;方便以后查看。 Fork&#xff08;克隆复制项目&#xff09; 复制别人的仓库&…...

react + vite 中的环境变量怎么获取

一、Vite 环境变量基础 创建一个.env文件&#xff0c;Vite 定义的环境变量需要以VITE_开头。 VITE_API_URL "http://localhost:3000/api" 生产模式创建.env.production。 VITE_API_URL "https://production-api-url.com/api" 二、在 React 组件中获…...

leetcode hot100【 LeetCode 54.螺旋矩阵】java实现

LeetCode 54.螺旋矩阵 题目描述 给定一个 m x n 的矩阵&#xff0c;返回其元素按照螺旋顺序的数组。 示例 1: 输入: [[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ] ]输出: [1, 2, 3, 6, 9, 8, 7, 4, 5]示例 2: 输入: [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12] ]输出: [1, …...

Axios与FastAPI结合:构建并请求用户增删改查接口

在现代Web开发中&#xff0c;FastAPI以其高性能和简洁的代码结构成为了构建RESTful API的热门选择。而Axios则因其基于Promise的HTTP客户端特性&#xff0c;成为了前端与后端交互的理想工具。本文将介绍FastAPI和Axios的结合使用&#xff0c;通过一个用户增删改查&#xff08;C…...

插入排序算法

一、基本思想 插入排序通过构建有序序列&#xff0c;对于未排序的数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。它重复这个过程直到所有数据都被处理过。 二、示例 public class InsertionSort {public static void main(String[] args) {in…...

如何启动 Docker 服务:全面指南

如何启动 Docker 服务:全面指南 一、Linux 系统(以 Ubuntu 为例)二、Windows 系统(以 Docker Desktop 为例)三、macOS 系统(以 Docker Desktop for Mac 为例)四、故障排查五、总结Docker,作为一种轻量级的虚拟化技术,已经成为开发者和运维人员不可或缺的工具。它允许用…...

摄影相关常用名词

本文介绍与摄影相关的常用名词。 曝光 Exposure 感光元件接收光线的过程&#xff0c;决定图像的明暗程度和细节表现。 光圈 Aperture 控制镜头进光量的孔径大小&#xff0c;用 F 值&#xff08;f-stop&#xff09; 表示。 光圈越大&#xff08;F 值越小&#xff09;&#xff0c…...

kafka消费者组和分区数之间的关系是怎样的?

消费者组和分区数之间的关系决定了Kafka中消息的消费方式和负载均衡。合理配置分区数和消费者数量对于优化Kafka的性能和资源利用率至关重要。以下是这种关系的几个关键点&#xff1a; 一个分区只能被同一组的一个消费者消费&#xff1a;这是为了保证消息的顺序性。在同一个消费…...

【num_groups、 groups、init_filters以及归一化的选择】

目录 省流总结&#xff1a;一、num_groups与 groups的关系1. num_groups在代码中的作用(1) 定义(2) num_groups的值的不同影响1. 每组的通道数量&#xff1a;2. 计算效率&#xff1a;3. 对模型表现的影响&#xff1a;4. 对分割任务的影响&#xff1a;5. 训练稳定性&#xff1a;…...

Java设计模式——职责链模式:解锁高效灵活的请求处理之道

嘿&#xff0c;各位 Java 编程大神和爱好者们&#xff01;今天咱们要一同深入探索一种超厉害的设计模式——职责链模式。它就像一条神奇的“处理链”&#xff0c;能让请求在多个对象之间有条不紊地传递&#xff0c;直到找到最合适的“处理者”。准备好跟我一起揭开它神秘的面纱…...

ubuntu20配置mysql注意事项

目录 一、mysql安装 二、初始化配置密码 三、配置文件的位置 四、常用的mysql命令 五、踩坑以及解决方法 一、mysql安装 1.更新apt源 sudo apt update 2.安装mysql服务 sudo apt-get install mysql-server 3.初始化配置 sudo mysql_secure_installation 4.配置项 VALI…...

JDBC 设置 PostgreSQL 查询中 any(?) 的参数

这段时间都纠缠于 Java 如何操作 PostgreSQL 数据库上&#xff0c;千方百计的为求得更好的性能。为此我们用上了 Batch, 或用 id any(?) 这种更 PostgreSQL 化的数组参数操作。其实它还有更多数组方面的花样可以玩&#xff0c;毕竟 PostgreSQL 数据库有一种广纳百川的胸怀&am…...

论文笔记(五十七)Diffusion Model Predictive Control

Diffusion Model Predictive Control 文章概括摘要1. Introduction2. Related work3. 方法3.1 模型预测控制3.2. 模型学习3.3. 规划&#xff08;Planning&#xff09;3.4. 适应 4. 实验&#xff08;Experiments&#xff09;4.1. 对于固定奖励&#xff0c;D-MPC 可与其他离线 RL…...

【在Linux世界中追寻伟大的One Piece】多线程(三)

目录 1 -> Linux线程同步 1.1 -> 条件变量 1.2 -> 同步概念与竞态条件 1.3 -> 条件变量函数 1.4 -> 为什么pthread_cond_wait需要互斥量 1.5 -> 条件变量使用规范 2 -> 生产者消费者模型 2.1 -> 为什么要使用生产者消费者模型 2.2 -> 生产…...

eBay 基于 Celeborn RESTful API 进行自动化工具集成实践

作者&#xff1a;王斐&#xff0c;ebay Hadoop 团队软件工程师&#xff0c;Apache Kyuubi PMC member&#xff0c;Apache Celeborn Committer。 简介&#xff1a;Apache Celeborn 是一个统一的大数据中间服务&#xff0c;致力于提高不同MapReduce引擎的效率和弹性。为了Spark …...

Vue 前端 el-input 如何实现输入框内容始终添加在尾部%

要在 el-input 输入框的尾部添加 %&#xff0c;你可以通过两种方式来实现&#xff1a; 使用 suffix 插槽&#xff1a;这是最直接和最常用的方法。使用 append 插槽&#xff1a;如果你需要在输入框内或者右侧显示其他内容。 方法 1&#xff1a;使用 suffix 插槽 el-input 提供…...

如何通过轻易云实现泛微OA与金蝶云星空的数据无缝对接

FD003-非生产性付款申请 泛微>金蝶付款单-422 数据集成案例分享 在企业信息化系统中&#xff0c;数据的高效流转和准确对接是确保业务流程顺畅运行的关键。本文将重点探讨如何通过轻易云数据集成平台&#xff0c;实现泛微OA-Http与金蝶云星空之间的数据无缝对接&#xff0c…...

【docker】docker的起源与容器的由来、docker容器的隔离机制

Docker 的起源与容器的由来 1. 虚拟机的局限&#xff1a;容器的需求萌芽 在 Docker 出现之前&#xff0c;开发和部署软件主要依赖虚拟机&#xff08;VMs&#xff09;&#xff1a; 虚拟机通过模拟硬件运行操作系统&#xff0c;每个应用程序可以运行在自己的独立环境中。虽然虚…...

mysql 事务之LBCC与MVCC

一、事务 数据库事务&#xff08;Database Transaction&#xff09;是数据库管理系统&#xff08;DBMS&#xff09;中执行的一系列操作&#xff0c;这些操作被当作一个逻辑单元进行处理&#xff0c;以保证数据的一致性和完整性。 ACID&#xff0c;事务四个关键特性 1、原子性…...

记一次 .NET某hdp智能柜系统 卡死分析

一&#xff1a;背景 1. 讲故事 停了一个月时间没有更新博客了&#xff0c;主要是这段时间有些许事情导致心神不宁&#xff0c;我这个人也比较浮躁所以无法潜心修炼&#xff0c;事情如下&#xff1a; 被狗咬了 也不知道是不是出门没看黄历&#xff0c;在小区门口店里买烟&am…...

大模型专栏--Spring Ai Alibaba介绍和功能演示

Spring AI Alibaba 介绍和功能演示 背景 Spring AI Alibaba 开源项目基于 Spring AI 构建&#xff0c;是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践&#xff0c;提供高层次的 AI API 抽象与云原生基础设施集成方案&#xff0c;帮助开发者快速构建 AI 应用。…...

【GPT】为什么人需要睡觉?

睡觉对人类来说是至关重要的生理和心理需求。以下是一些为什么人需要睡觉的主要原因&#xff0c;以及睡眠对身体和大脑的影响&#xff1a; 1. 恢复与修复 身体修复&#xff1a;在睡眠期间&#xff0c;身体进行细胞修复和再生。例如&#xff0c;生长激素在深度睡眠中分泌&#…...

【Linux】磁盘 | 文件系统 | inode

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 模电好难啊&#xff…...

A051-基于Spring Boot的网络海鲜市场系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…...

谷歌浏览器Chrome打开百度很慢,其他网页正常的解决办法,试了很多,找到了适合的

最近不知怎么的&#xff0c;Chrome突然间打开百度很慢&#xff0c;甚至打不开。不光我一个人遇到这问题&#xff0c;我同事也遇到这个问题。开发中难免遇到问题&#xff0c;需要百度&#xff0c;现在是百度不了。 作为一名开发人员&#xff0c;习惯了使用Chrome进行开发&#…...

《企业级低代码开发平台技术要求》核心要点解析

一、引言 在数字化转型的浪潮中&#xff0c;企业级低代码开发平台成为推动企业创新与发展的关键力量。深圳市标准化协会发布的《企业级低代码开发平台技术要求》&#xff08;T/SZAS 77—2024&#xff09;为该领域提供了重要的规范与指引。深入剖析其核心要点&#xff0c;对于理…...

AI一键生成3D动画:腾讯最新方案,为小程序带来革命性变化

随着3D技术的快速发展,将静态的3D模型转化为能够生动展现各种动作的角色已经成为许多创作者和开发者梦寐以求的能力。然而,在过去,这一过程往往需要大量的手动工作和技术积累。现在,腾讯推出了一项创新的技术——AI一键生成3D动画,它不仅极大地简化了流程,还显著提高了效…...

AD软件如何快速切换三维视图,由2D切换至3D,以及如何恢复

在Altium Designer软件中&#xff0c;切换三维视图以及恢复二维视图的操作相对简单。以下是具体的步骤&#xff1a; 切换三维视图 在PCB设计界面中&#xff0c;2D切换3D&#xff0c;快捷键按住数字键盘中的“3”即可切换&#xff1b; 快捷键ctrlf&#xff08;或者vb快捷键也…...

【赵渝强老师】PostgreSQL的数据库

PostgreSQL的逻辑存储结构主要是指数据库中的各种数据库对象&#xff0c;包括&#xff1a;数据库集群、数据库、表、索引、视图等等。所有数据库对象都有各自的对象标识符oid&#xff08;object identifiers&#xff09;,它是一个无符号的四字节整数&#xff0c;相关对象的oid都…...

opencv 区域提取三种算法

opencv 区域提取三种算法 1.轮廓查找 findContours()函数&#xff0c;得到轮廓的点集集合 cv::vector<cv::vector<Point>> contours;threshold(roiMat,binImg,m_pPara.m_nMinGray,m_pPara.m_nMaxGray,THRESH_BINARY);//膨胀处理Mat dilaElement getStructuringE…...

C++初阶(十六)--STL--list的模拟实现

目录 结点类的实现 迭代器类的模拟实现 迭代器类的模板参数说明 构造函数 *运算符重载 ->运算符的重载 运算符的重载 --运算符重载 !运算符重载 运算符重载 list类的模拟实现 成员变量 默认成员函数 构造函数 拷贝构造函数 赋值运算符重载 迭代器相关函数 …...

树莓集团:以人工智能为核心,打造数字化生态运营新典范

在当今数字化浪潮席卷全球的背景下&#xff0c;各行各业都在积极探索数字化转型的路径。作为数字产业的领军者&#xff0c;树莓集团凭借其深厚的技术积累和创新理念&#xff0c;在人工智能、大数据、云计算等前沿技术领域不断突破&#xff0c;成功打造了一个以人工智能为核心的…...

基于深度学习的卷积神经网络十二生肖图像识别系统(PyQt5界面+数据集+训练代码)

本研究提出了一种基于深度学习的十二生肖图像识别系统&#xff0c;旨在利用卷积神经网络&#xff08;CNN&#xff09;进行图像分类&#xff0c;特别是十二生肖图像的自动识别。系统的核心采用了两种经典的深度学习模型&#xff1a;ResNet50和VGG16&#xff0c;进行图像的特征提…...

Torchtune在AMD GPU上的使用指南:利用多GPU能力进行LLM微调与扩展

Torchtune on AMD GPUs How-To Guide: Fine-tuning and Scaling LLMs with Multi-GPU Power — ROCm Blogs 这篇博客提供了一份详细的使用Torchtune在AMD GPU上微调和扩展大型语言模型&#xff08;LLM&#xff09;的指南。Torchtune 是一个PyTorch库&#xff0c;旨在让您轻松地…...

ESLint

代码规范 一套写代码的约定规则&#xff1b;比如赋值符号左右是否需要空格&#xff0c;一句话结束是否要加&#xff1b;.... 代码规范错误 如果你的代码不符合standard的要求&#xff0c;ESLint&#xff08;脚手架里配的东西&#xff09;会告诉你哪个文件第几行错了 解决代码…...

小程序-基于java+SpringBoot+Vue的微信小程序养老院系统设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…...

如何具体实现商品详情的提取?

在电商领域&#xff0c;获取商品详情信息对于市场分析、价格比较、商品推荐等应用场景至关重要。本文将详细介绍如何使用Java编写爬虫程序&#xff0c;以合法合规的方式获取淘宝商品的详情信息&#xff0c;并提供详细的代码示例。 1. 环境准备 在开始编写爬虫之前&#xff0c;…...

antd table 自定义表头过滤表格内容

注意&#xff1a;该功能只能过滤可一次性返回全部数据的表格&#xff0c;通过接口分页查询的请自主按照需求改动哈~ 实现步骤&#xff1a; 1.在要过滤的列表表头增加过滤图标&#xff0c;点击图标显示浮窗 2.浮窗内显示整列可选选项&#xff0c;通过勾选单选或者全选、搜索框来…...

高效处理 iOS 应用中的大规模礼物数据:以直播项目为例(1-礼物池)

引言 在现代iOS应用开发中&#xff0c;处理大规模数据是一个常见的挑战。尤其实在直播项目中&#xff0c;礼物面板作为展示用户互动的重要部分&#xff0c;通常需要实时显示海量的礼物数据。这些数据不仅涉及到不同的区域、主播的动态差异&#xff0c;还需要保证高效的加载与渲…...

Maven - 优雅的管理多模块应用的统一版本号

文章目录 概述一、使用 versions-maven-plugin 插件1. 在主 pom.xml 中定义插件2. 修改版本号3. 回退修改4. 提交修改 二、使用占位符统一管理版本号1. 在主 pom.xml 中定义占位符2. 使用 flatten-maven-plugin 插件自动替换占位符3. 修改版本号4. 为什么这种方式更方便&#x…...

C++设计模式(观察者模式)

一、介绍 1.动机 在软件构建过程中&#xff0c;我们需要为某些对象建立一种“通知依赖关系”&#xff0c;即一个对象的状态发生改变&#xff0c;所有的依赖对象&#xff08;观察者对象&#xff09;都将得到通知。如果这样的依赖关系过于紧密&#xff0c;将使软件不能很好地抵…...

【unity】WebSocket 与 EventSource 的区别

WebSocket 也是一种很好的选择&#xff0c;尤其是在需要进行 双向实时通信&#xff08;例如聊天应用、实时数据流等&#xff09;时。与 EventSource 不同&#xff0c;WebSocket 允许客户端和服务器之间建立一个持久的、全双工的通信通道。两者的区别和适用场景如下&#xff1a;…...

从ETL到DataOps:WhaleStudio替代Informatica,实现信创化升级

作者 | 白鲸开源 姜维 在数据集成和调度的领域&#xff0c;Informatica曾经是公认的权威工具。其强大的ETL功能、多年积累的市场经验&#xff0c;使其成为众多企业数据处理的核心工具。 然而&#xff0c;随着新一代大数据平台的迅速崛起&#xff0c;以及信创化改造的要求愈发严…...

第四十二篇 EfficientNet:重新思考卷积神经网络的模型缩放

文章目录 摘要1、简介2、相关工作3、复合模型缩放3.1、 问题公式化3.2、扩展维度3.3、复合比例 4、EfficientNet架构5、实验5.1、扩展MobileNets和ResNets5.2、EfficientNet的ImageNet结果5.3、EfficientNet的迁移学习结果 6、讨论7、结论 摘要 卷积神经网络(ConvNets)通常在固…...

[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式

T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求&#xff1a; 编译硬件需求&#xff1a;做多系统测试&#xff0c;磁盘500GB起步(固态)&#xff08;机械会卡死&#xff09;&#xff0c;内存3…...

Web Worker 和 WebSocket的区别

Web Worker&#xff08;消息传递机制&#xff09; 定义&#xff1a;是为了在浏览器中提供多线程支持&#xff0c;允许 JavaScript 在后台线程运行&#xff0c;而不阻塞主线程。它非常适合执行耗时的计算任务或处理大量数据&#xff0c;避免主线程&#xff08;通常是 UI 线程&a…...

vmware Ubuntu2004运行STAR-Searcher

github链接 安装ros noetic gazebo11 略 gazebo更新方法 sudo sh -c echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable lsb_release -cs main" > /etc/apt/sources.list.d/gazebo-stable.list wget https://packages.osrfoundation.org/gaz…...