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

iOS App的启动与优化

App的启动流程

App启动分为冷启动和热启动

  • 冷启动:从0开始启动App
  • 热启动:App已经在内存中,但是后台还挂着,再次点击图标启动App。

一般对App启动的优化都是针对冷启动。

App冷启动可分为三个阶段:

  1. dyld:加载镜像、动态库
  2. RunTime方法
  3. main函数初始化

动态库vs静态库

静态库:一堆.o文件的集合(通常是.a后缀),还没有被链接过,缺点是产物体积比较大,优点是链接到App之后体积比较小。

动态库:一个已经链接完全的镜像,优点是产物体积比较小,缺点是链接到App之后体积比较大。

两者最大的区别就是静态库没有被链接过,而动态库被链接过。

一.dyld

dyld是app的动态链接器。主要可以用来装载Mach-O文件(可执行文件、动态库等)

启动APP时,dyld所做的事情有:

加载过程从exec()函数开始,这是一个系统调用。操作系统首先为进程分配一段内存空间。然后执行以下操作:

  • 1.把App的可执行文件加载到内存
  • 2.把dyld加载到内存
  • 3.dyld进行动态链接

具体内容:

  • 1、加载动态库
    • Dyld从主执行文件的header获取到需要加载的所依赖动态库列表,然后它需要找到每个 dylib,而应用所依赖的 dylib 文件可能会再依赖其他 dylib,所以所需要加载的是动态库列表一个递归依赖的集合
  • 2、Rebase和Binding
    • 1、Rebase(偏移修正)

             任何一个app生成的二进制文件,在二进制文件内部所有的方法、函数调用,都有一个地址,这个地址是在当前二进制文件中的偏移地址。一旦在运行时刻(即运行到内存中),每次系统都会随机分配一个ASLR(Address Space Layout Randomization,地址空间布局随机化)地址值(是一个安全机制,会分配一个随机的数值,插入在二进制文件的开头),例如,二进制文件中有一个 test方法,偏移值是0x0001,而随机分配的ASLR是0x1f00,如果想访问test方法,其内存地址(即真实地址)变为 ASLR+偏移值 = 运行时确定的内存地址(即0x1f00+0x0001 = 0x1f01)

    • 2、Binding(绑定)

             例如NSLog方法,在编译时期生成的mach-o文件中,会创建一个符号!NSLog(目前指向一个随机的地址),然后在运行时(从磁盘加载到内存中,是一个镜像文件),会将真正的地址给符号(即在内存中将地址与符号进行绑定,是dyld做的,也称为动态库符号绑定),一句话概括:绑定就是给符号赋值的过程

二.RunTime阶段

dyld阶段结束之后就进入RunTime阶段,这个阶段主要进行如下内容:

1、Objc setup

  • 1、注册Objc类 (class registration)
  • 2、把category的定义插入方法列表 (category registration)
  • 3、保证每一个selector唯一 (selector uniquing)

2、Initializers

  • 1、Objc的+load()函数
  • 2、C++的构造函数属性函数
  • 3、非基本类型的C++静态全局变量的创建(通常是类或结构体)

三.main()函数初始化

App的启动由dyld主导,把可执行文件加载到内存,并且加载所有依赖的动态库,并由RunTime负责加载成objc定义的结构,所有初始化工作结束后,dyld就会调用mainn函数 接下来就是UIApplicationMain函数,AppDelegate的application:didFinishLaunchingWithOptions:方法

这个里面往往是最占用启动时间的地方,同时也是我们最为可控的地方。

• 进入 main() 函数,启动应用。

• 执行 UIApplicationMain() 函数,创建 UIApplication 对象并设置 AppDelegate。

• 加载应用的主 UI,包括 storyboard 或 xib 文件,以及 AppDelegate 的各种生命周期方法,如 application:didFinishLaunchingWithOptions:。

四.首屏渲染阶段

初始化rootViewController,加载和渲染界面

渲染完成后,用户将看到应用的首屏。

 

App冷启动流程总结:

1. dyld 加载阶段:

• 动态链接器 dyld 负责加载应用的可执行文件及其依赖的动态库。此时,系统将会做如下工作:

• 查找应用的可执行文件和动态库

• 将它们加载到内存中

• 进行符号解析和绑定

• 执行初始化函数(如 +load 方法和静态构造函数)

2. runtime 初始化阶段:

• ObjC 运行时对类和分类进行注册。

• 执行各类 +load 方法,这个阶段还会进行一些 Swift 类的初始化。

3. main() 函数执行阶段:

• 进入 main() 函数,启动应用。

• 执行 UIApplicationMain() 函数,创建 UIApplication 对象并设置 AppDelegate。

• 加载应用的主 UI,包括 storyboard 或 xib 文件,以及 AppDelegate 的各种生命周期方法,如 application:didFinishLaunchingWithOptions:。

4. 首屏渲染阶段:

• 初始化 rootViewController,加载和渲染界面。

• 渲染完成后,用户将看到应用的首屏。

+load与+initialize

1、+load

(1)+load方法是一定会在runtime中被调用的。只要类被添加到runtime中了,就会调用+load方法,因此+load方法总是在main函数之前调用

(2)+load方法不会覆盖。也就是说,如果子类实现了+load方法,那么会先调用父类的+load方法(无需手动调用super),然后又去执行子类的+load方法。

(3)+load方法只会调用一次。

(4)+load方法执行顺序是:类 -> 子类 ->分类。而不同分类之间的执行顺序不一定,依据在Compile Sources中出现的顺序(先编译,则先调用,列表中在下方的为“先”)。

(5)+load方法是函数指针调用,即遍历类中的方法列表,直接根据函数地址调用。如果子类没有实现+load方法,子类也不会自动调用父类的+load方法。

2、+initialize

(1)+initialize方法是在类或它的子类收到第一条消息之前被调用的,这里所指的消息包括实例方法和类方法的调用。因此+initialize方法总是在main函数之后调用

(2)+initialize方法只会调用一次。

(3)+initialize方法实际上是一种惰性调用,如果一个类一直没被用到,那它的+initialize方法也不会被调用,这一点有利于节约资源。

(4)+initialize方法会覆盖。如果子类实现了+initialize方法,就不会执行父类的了,直接执行子类本身的。如果分类实现了+initialize方法,也不会再执行主类的。

(5)+initialize方法的执行覆盖顺序是:分类 -> 子类 ->类。且只会有一个+initialize方法被执行

(6)+initialize方法是发送消息(objc_msgSend()),如果子类没有实现+initialize方法,也会自动调用其父类的+initialize方法。

3、两者的异同

(1)相同点

  1. load和initialize会被自动调用,不能手动调用它们。
  2. 子类实现了load和initialize的话,会隐式调用父类的load和initialize方法。
  3. load和initialize方法内部使用了锁,因此它们是线程安全的。

(2)不同点

  1. 调用顺序不同,以main函数为分界,+load方法在main函数之前执行,+initialize在main函数之后执行。(存疑)
  2. 子类中没有实现+load方法的话,子类不会调用父类的+load方法;而子类如果没有实现+initialize方法的话,也会自动调用父类的+initialize方法。
  3. +load方法是在类被装在进来的时候就会调用,+initialize在第一次给某个类发送消息时调用(比如实例化一个对象),并且只会调用一次,是懒加载模式,如果这个类一直没有使用,就不回调用到+initialize方法。

4、使用场景

(1)+load一般是用来交换方法,由于它是线程安全的,而且一定会调用且只会调用一次,通常在使用UrlRouter的时候注册类的时候也在+load方法中注册。
(2)+initialize方法主要用来对一些不方便在编译期初始化的对象进行赋值,或者说对一些静态常量进行初始化操作。

冷启动时间优化

1.减少动态库(dyld阶段)

一般不多于6个,多余需要进行合并,动态库越多,dyld阶段加载时间越长。

2.减少类和方法的数量

3.延迟初始化(rebase/Binging阶段)

尽量延迟一些不必要的初始化工作,不要在启动时立即初始化所有对象。可以使用懒加载将一些初始化放到用户需要时再进行,以减轻启动阶段的负担。

4. 避免 +load 方法的使用(Initializers阶段)

+load 方法会在 dyld 加载阶段执行,建议用 +initialize 或者在合适的地方延迟执行初始化逻辑,避免阻塞启动流程。

5.优化 AppDelegate(main()阶段)

application:didFinishLaunchingWithOptions: 方法应保持精简,避免在这里进行耗时的操作。将一些耗时任务放到后台队列中异步执行。

6.减少主线程阻塞

启动阶段尽量避免主线程的耗时操作,如文件 I/O、网络请求等。将这些操作放到子线程处理,以免阻塞界面渲染。

7.预编译和瘦身

移除未使用的代码、图片等资源,精简应用的体积,从而减少加载时间。

尽量减少 storyboard 的使用,尤其是大而复杂的 storyboard,可以分解成多个小的 storyboard 或者使用纯代码实现界面。

8.启动时的网络请求

尽量避免在启动时进行同步的网络请求,如果必须请求,可以在启动完成后或在后台进行异步请求,以减少对启动时间的影响。
 

参考:

iOS--App启动过程及优化_ios启动优化-CSDN博客

https://juejin.cn/post/6951591401528229895?searchId=202502182003101C89E818EB9B45117D0A

JHBlog/iOS知识点/iOS大杂烩/APP启动优化/App启动时间优化.md at master · SunshineBrother/JHBlog · GitHub

 

 

相关文章:

iOS App的启动与优化

App的启动流程 App启动分为冷启动和热启动 冷启动:从0开始启动App热启动:App已经在内存中,但是后台还挂着,再次点击图标启动App。 一般对App启动的优化都是针对冷启动。 App冷启动可分为三个阶段: dyld&#xff1a…...

一周学会Flask3 Python Web开发-request请求钩子(Hook)

锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 有时候我们业务需求对请求做一些鉴权,日志,统计分析等功能,这时候可以对请求进行预处理( …...

git clone

方法一(替换URL) git clone https://gitclone.com/github.com/tendermint/tendermint.git 方法二(设置git参数) git config --global url."https://gitclone.com/".insteadOf https:// git clone https://github.co…...

nginx ngx_http_module(8) 指令详解

nginx ngx_http_module(8) 指令详解 nginx 模块目录 nginx 全指令目录 一、目录 1.1 模块简介 ngx_http_ssi_module:服务器端包含(SSI)模块,允许在HTML页面中插入其他内容或动态生成的内容。通过特殊的SSI指令(如 …...

Apache Struts RCE (CVE-2024-53677)

前言 对目前的Apache Struts RCE (CVE-2024-53677)的poc进行总结,由于只能单个ip验证,所以自己更改一下代码,实现:多线程读取url验证并保存,更改为中文解释 免责声明 请勿利用文章内的相关技术从事非法测试&#xf…...

windows系统本地部署DeepSeek-R1全流程指南:Ollama+Docker+OpenWebUI

本文将手把手教您使用OllamaDockerOpenWebUI三件套在本地部署DeepSeek-R1大语言模型,实现私有化AI服务搭建。 一、环境准备 1.1 硬件要求 CPU:推荐Intel i7及以上(需支持AVX2指令集) 内存:最低16GB,推荐…...

前端:最简单封装nmp插件(组件)过程。

一、nmp使用 1、注册nmp账号:npm | Home 2、创建插件名称文件夹,如: vue3-components 3、初始化一个package.json文件:nmp init npm init package.json配置用处介绍,如下: {// 包名,必须…...

百度搜索融合 DeepSeek 满血版,开启智能搜索新篇

百度搜索融合 DeepSeek 满血版,开启智能搜索新篇 🚀 🔹 一、百度搜索全量接入 DeepSeek 🔹 百度搜索迎来重要升级,DeepSeek 满血版全面上线!🎉 用户在百度 APP 搜索后,点击「AI」即…...

导出指定文件夹下的文件结构 工具模块-Python

python模块代码 import os import json import xml.etree.ElementTree as ET from typing import List, Optional, Dict, Union from pathlib import Path class DirectoryTreeExporter:def __init__(self,root_path: str,output_file: str,fmt: str txt,show_root: boo…...

V4L2驱动之UVC

以下是关于V4L2摄像头驱动框架与UVC协议的关联分析,从内核驱动到用户空间的完整视角: 1. V4L2驱动框架核心架构 关键组件: 核心层 (V4L2 Core) v4l2_device:设备的总入口,管理所有子组件video_device:对应…...

【Linux】匿名管道的应用场景-----管道进程池

目录 一、池化技术 二、简易进程池的实现: Makefile task.h task.cpp Initchannel函数: 创建任务: 控制子进程: 子进程执行任务: 清理收尾: 三、全部代码: 前言: 对于管…...

umi react+antd 判断渲染消息提示、input搜索、多选按钮组

记得map里返回的每层遍历结构都要带上key(图里没加,最近在接手react,熟悉中......

Windows桌面系统管理5:Windows 10操作系统注册表

Windows桌面系统管理0:总目录-CSDN博客 Windows桌面系统管理1:计算机硬件组成及组装-CSDN博客 Windows桌面系统管理2:VMware Workstation使用和管理-CSDN博客 Windows桌面系统管理3:Windows 10操作系统部署与使用-CSDN博客 Wi…...

华为昇腾 910B 部署 DeepSeek-R1 蒸馏系列模型详细指南

本文记录 在 华为昇腾 910B(65GB) * 8 上 部署 DeepSeekR1 蒸馏系列模型(14B、32B)全过程与测试结果。 NPU:910B3 (65GB) * 8 (910B 有三个版本 910B1、2、3) 模型:DeepSeek-R1-Distill-Qwen-14B、DeepSeek…...

文献阅读 250219-Global water availability boosted by vegetation-driven changes (1)

Global water availability boosted by vegetation-driven changes in atmospheric moisture transport 来自 <https://www.nature.com/articles/s41561-022-01061-7> ## Abstract: 全球水资源的可用性是气候变化研究中的重要议题&#xff0c;尤其是随着气候变化的加剧&a…...

蓝桥杯篇---超声波距离测量频率测量

文章目录 简介第一部分&#xff1a;超声波的简介工作原理1.发射超声波2.接收反射波3.计算时间差4.计算距离 硬件连接1.Trig2.Echo 示例代码代码说明注意事项1.声速2.延时精度3.硬件连接 第二部分&#xff1a;频率测量简介频率测量原理1.信号输入2.计数3.计算频率 硬件连接示例代…...

【玩转 Postman 接口测试与开发2_020】(完结篇)DIY 实战:随书示例 API 项目本地部署保姆级搭建教程(含完整调试过程)

《API Testing and Development with Postman》最新第二版封面 文章目录 最新版《Postman 接口测试与开发实战》示例 API 项目本地部署保姆级搭建教程1 前言2 准备工作3 具体部署3.1 将项目 Fork 到自己名下3.2 创建虚拟环境并安装依赖3.3 初始运行与项目调试 4 示例项目的用法…...

LearnOpenGL——高级OpenGL(下)

教程地址&#xff1a;简介 - LearnOpenGL CN 高级数据 原文链接&#xff1a;高级数据 - LearnOpenGL CN 在OpenGL中&#xff0c;我们长期以来一直依赖缓冲来存储数据。本节将深入探讨一些操作缓冲的高级方法。 OpenGL中的缓冲本质上是一个管理特定内存块的对象&#xff0c;它…...

wangEditor 编辑器 Vue 2.0 + Nodejs 配置

资料 Vue2.0 版本的安装&#xff1a;https://www.wangeditor.com/v5/for-frame.html#%E4%BD%BF%E7%94%A8上传图片配置&#xff1a;https://www.wangeditor.com/v5/menu-config.html#%E4%B8%8A%E4%BC%A0%E5%9B%BE%E7%89%87 安装步骤 1.安装界面基础部分 <!-- 富文本编辑器…...

机器学习·数据处理

前言 对于大规模数据&#xff0c;我们经常会使用python内置函数或者编写脚本进行批量化处理&#xff0c;从而提高后续使用算法的效率。 1. 正则表达式 定义&#xff1a;用于检索、替换符合某个模式的文本&#xff0c;是文本预处理常用技术。基本语法 符号描述.匹配除换行符 …...

如何在Bigemap Pro中用线分割面、挖空

有时候需要以一条线为界对面元素进行分割或者是需要在一个面元素里面挖空一个面形状的洞&#xff0c;对此需求可以使用bigemap pro工具实现&#xff0c;这里为你介绍一下具体的操作方法。 【一】画线分割面 第一步&#xff1a;现在这是一个不规则多边形&#xff0c;想要以手动…...

网络安全入门攻击与防御实战(四)

漏洞利用&#xff1a;永恒之蓝&#xff08;MS17-010&#xff09;与同类漏洞解析 1 永恒之蓝&#xff08;MS17-010&#xff09;漏洞背景 &#xff08;1&#xff09;漏洞信息 CVE编号&#xff1a;CVE-2017-0143 ~ CVE-2017-0148 影响范围&#xff1a;Windows XP ~ Windows 201…...

DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方DeepSeek接入)

前言 在当今数字化时代&#xff0c;AI编程助手已成为提升开发效率的利器。DeepSeek作为一款强大的AI模型&#xff0c;凭借其出色的性能和开源免费的优势&#xff0c;成为许多开发者的首选。今天&#xff0c;就让我们一起探索如何将DeepSeek接入PyCharm&#xff0c;实现高效、智…...

CF1801D

CF1801D 题目大意&#xff1a; n n n 个顶点&#xff0c; m m m 条边的图。你一开始在起点 1&#xff0c;拥有 P P P 枚硬币&#xff0c;通过每条 ( i , j ) (i,j) (i,j) 边都需要花费一定的硬币 s ( i , j ) s(i,j) s(i,j)。但你在每个城市 i i i 都可以打工赚硬币 w i w…...

大厂算法面试常见问题总结:高频考点与备战指南

在大厂算法面试中&#xff0c;数据结构与算法是必考的核心内容。 无论是校招还是社招&#xff0c;算法题的表现往往决定了面试的成败。 为了帮助大家更好地备战&#xff0c;本文总结了大厂算法面试中的高频考点&#xff0c;并提供了详细的备战建议&#xff0c;助你轻松应对面…...

【R语言】主成分分析与因子分析

一、主成分分析 主成分分析&#xff08;Principal Component Analysis, PCA&#xff09;是一种常用的无监督数据降维技术&#xff0c;广泛应用于统计学、数据科学和机器学习等领域。它通过正交化线性变换将&#xff08;高维&#xff09;原始数据投影到一个新的坐标系&#xff…...

解锁 AIoT 无限可能,乐鑫邀您共赴 Embedded World 2025

2025 年 3 月 11-13 日&#xff0c;全球规模最大的嵌入式展览会——Embedded World 2025 将在德国纽伦堡盛大开幕。作为物联网和嵌入式技术领域的领先企业&#xff0c;乐鑫信息科技 (688018.SH) 将展示在 AI LLM、HMI、双频 Wi-Fi 6、低功耗 MCU 和 Matter 等领域的最新技术及解…...

人工智能基础之数学基础:01高等数学基础

函数 极限 按照一定次数排列的一列数:“&#xff0c;“,…,"…&#xff0c;其中u 叫做通项。 对于数列{Un}如果当n无限增大时&#xff0c;其通项无限接近于一个常数A&#xff0c;则称该数列以A为极限或称数列收敛于A&#xff0c;否则称数列为发散&#xff0c; 极限值 左…...

【从0做项目】Java搜索引擎(8) 停用词表 正则

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 文章导读 零&#xff1a;项目结果展示 一&#xff1a;前引 二&#xff1a;停用词表 1&#xff1a;…...

线程和进程的区别

如果说一个服务器同一时刻收到了许多请求&#xff0c;针对每一个请求&#xff0c;操作系统都会产生一个进程&#xff0c;从而给这个请求提供一些服务 &#xff0c;返回响应&#xff0c;如果请求处理完了&#xff0c;这个进程就要销毁了&#xff01;如果请求很多的话&#xff0c…...

深入理解 QObject的作用

QObject 作为 Qt 库中所有对象的基类&#xff0c;其地位无可替代。几乎 Qt 框架内的每一个类&#xff0c;无论是负责构建用户界面的 QWidget&#xff0c;还是专注于数据处理与呈现的 QAbstractItemModel&#xff0c;均直接或间接继承自 QObject。这种继承体系赋予 Qt 类库高度的…...

解码 NLP:从萌芽到蓬勃的技术蜕变之旅

内容概况&#xff1a; 主要讲述NLP专栏的内容和NLP的发展及其在现代生活中的广泛应用。课程强调实践为主、理论为辅的学习方法&#xff0c;并通过多个生活场景展示了NLP技术的实际应用&#xff0c;如对话机器人、搜索引擎、翻译软件、电商推荐和智能客服等。 这边我就不多做自我…...

【核心算法篇十五】《深度解析DeepSeek遗传算法:让超参数调优从“玄学”变“科学”的终极指南》

引言:超参数调优的“炼丹困局”与破局之路 在机器学习的世界里,调参工程师常被戏称为"炼丹师"——面对动辄几十个超参数的复杂模型,我们就像古代术士守着炼丹炉,不断尝试各种参数组合,期待偶然炼出"仙丹"。传统网格搜索(Grid Search)需要遍历所有可…...

Python—变量、基本数据类型、类型的转换

文章目录 Python—变量、基本数据类型1 格式化输出2 号的使用3 变量的数据类型4 type() 函数的使用5 数据类型的基本介绍5.1 int 整型5.2 float 浮点类型5.3 bool 布尔类型5.4 str 字符串类型5.5 字符串驻留机制5.6 数据类型的转换&#xff08;1&#xff09;隐式转换&#xff…...

启明星辰规则库下载

启明星辰规则库下载 一、脚本介绍 1、背景介绍 因为项目上有启明星辰的安全设备、并且在内网无法直接连接互联网进行在线升级&#xff0c;必须使用离线升级模式&#xff0c;下载规则库升级&#xff0c;每月一更有点繁琐&#xff0c;所以写了这个b脚本&#xff0c;偷懒一下&a…...

uniapp 拖拽排序

1.拖拽排序 使用 sortablejs库 npm install sortablejs --save-dev <template><view id"list"><view v-for"(item, index) in list" :key"item.id" class"item">{{ item.name }}</view></view> </t…...

测试。。。

移动到中位数位置能保证总移动距离最小&#xff0c;数学知识 #include <iostream> #include <vector> #include <cmath> using namespace std;int main() {int n;string s;cin >> n >> s;vector<int> positions;// 记录所有1的位置for (…...

Java常用设计模式及其应用场景

1. 什么是设计模式&#xff1f; 设计模式是一个经过多次验证的、针对常见问题的可复用解决方案。设计模式并不是具体的代码实现&#xff0c;而是给出了如何解决问题的思路和结构。在实际开发过程中&#xff0c;设计模式有助于开发者快速找到合适的解决方案&#xff0c;从而减少…...

2000字,极简版华为数字化转型方法论

​作为国内科技行业的领军者&#xff0c;华为的成功经验为众多企业提供了宝贵的借鉴。本文将围绕准备、规划和执行三个阶段展开&#xff0c;结合华为的实践案例&#xff0c;深入剖析其数字化转型的方法论&#xff0c;希望能为您的企业数字化转型提供有益的参考。 一、数字化转型…...

Ubuntu:20.04更新cmake到更高版本

从输出信息可以看出&#xff0c;您当前的系统中已经安装了 cmake&#xff0c;但版本是 3.16.3&#xff0c;而您的项目需要 CMake 3.18 或更高版本。默认情况下&#xff0c;Ubuntu 20.04 的官方软件仓库中提供的 CMake 版本较低&#xff08;如 3.16.3&#xff09;&#xff0c;因…...

【SpringBoot教程】Spring Boot + MySQL + Druid连接池整合教程

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 前面毛毛张介绍过HikariCP连接池&#xff0c;今天毛毛张来介绍一下Druid连接池&#xff0c;SpringBoot 2.0以上默认使用HikariCP数据源&#xff0c;但是也要学会使用…...

基于SpringBoot实现的宠物领养系统平台功能一

一、前言介绍&#xff1a; 1.1 项目摘要 宠物领养需求增加&#xff1a;随着人们生活水平的提高和对宠物养护意识的增强&#xff0c;越来越多的人选择领养宠物作为家庭的一员。这导致了宠物领养需求的显著增加。 传统领养方式存在问题&#xff1a;传统的宠物领养方式&#xf…...

【DeepSeek 学C++】std::atomic 用于线程控制,和内存强顺序一致性

std::atomic<bool> workerTerminate_{}; std::atomic<bool> workerTerminate_{}; 是一个原子布尔变量的声明&#xff0c;变量名为 workerTerminate_。这种变量通常用于多线程编程中&#xff0c;用来控制或通知工作线程的终止。使用 std::atomic 可以确保对该变量的…...

计算存储一幅大小为 1024×10241024×1024、256 灰度级的图像所需的字节数

1. 图像的基本信息 图像分辨率&#xff1a;1024102410241024&#xff0c;表示图像有 1024 行和 1024 列&#xff0c;总像素数为&#xff1a; 102410241,048,576 像素102410241,048,576 像素 灰度级&#xff1a;256 灰度级&#xff0c;表示每个像素的灰度值可以用 256 个不同的值…...

Flutter 网络请求与数据处理:从基础到单例封装

Flutter 网络请求与数据处理&#xff1a;从基础到单例封装 在 Flutter 开发中&#xff0c;网络请求是一个非常常见的需求&#xff0c;比如获取 API 数据、上传文件、处理分页加载等。为了高效地处理网络请求和数据管理&#xff0c;我们需要选择合适的工具并进行合理的封装。 …...

从开发到部署:EasyRTC嵌入式视频通话SDK如何简化实时音视频通信的集成与应用

嵌入式设备和视频综合管理平台均支持B/S架构。在B/S架构下&#xff0c;传统的视频观看方式依赖于微软的OCX控件&#xff0c;然而OCX控件的使用正面临越来越多的挑战&#xff1a; 首先&#xff0c;用户需要安装浏览器插件、调整浏览器安全级别&#xff0c;并允许ActiveX控件弹出…...

Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300的秘密武器

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 企业级应用开发的需求日益增长。今天&#xff0c;我们要介绍的是一个在GitHub上广受好评的开源项目——Jeesite5。这不仅是一个技术框架&#xff0c;更…...

C++(23):lambda可以省略()

C越来越多的使用了lambda&#xff0c;C23也进一步的放宽了对lambda的限制&#xff0c;这一次&#xff0c;如果lambda没有参数列表&#xff0c;那么可以直接省略掉()&#xff1a; #include <iostream> using namespace std;void func() {auto f []{cout<<"in…...

vue3之echarts柱状图-圆锥加自动轮播

vue3之echarts柱状图-圆锥加自动轮播 效果&#xff1a; 版本 "echarts": "5.4.2" 核心代码&#xff1a; <template><div ref"echartRef" class"chart"></div><svg><linearGradient v-for"(item, i…...

Qt中利用httplib调用https接口

httplib中如果要调用https接口&#xff0c;需要开启OPENSSL支持&#xff0c;经过半天坑爹得摸索&#xff0c;总结下经验。 1&#xff0c;下载 并安装Win64OpenSSL 地址如下&#xff0c;我Qt版本是5.15.2 &#xff0c;openssl选择的是 64位&#xff08;Win64OpenSSL-3_3_3.msi…...