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

【iOS】alloc init new底层原理

目录

前言

alloc

alloc核心操作

cls->instanceSize(extraBytes)

calloc

obj->initInstanceIsa

init

类方法:

实例方法:

new


前言

笔者最近在进行对OC语言源码的学习,学习源码的过程中经常会出现一些从来没有遇见过的函数,因此很难把整个过程理解清楚,这篇博客先简单梳理一下我现在理解的 alloc & init & new 的实现过程以及内存对齐原理

alloc

首先从main函数中找到WGPerson类的alloc方法的实现:

在这个方法中,调用了_objc_rootAlloc,跳转到该函数的实现:

这个方法中又调用了callAlloc函数,同样跳转到该函数的实现:

这个函数是runtime中分配对象的核心方法之一,用于决定走哪条路径调用alloc或allocWithZone:

static ALWAYS_INLINE id
callAlloc(Class cls, bool checkNil, bool allocWithZone=false)

这两行是这个函数的定义部分,static说明这个函数只能在当前文件中使用,ALWAYS_INLINE表示这个函数应尽量内联,提高性能。

函数有三个参数,cls表示要分配内存的类,checkNil是一个bool变量,用于表明是否需要检查cls是否为nil,allocWithZone表示是否使用allocWithZone:方法。

函数内部实现里有三个判断,第一个判断是类是否为nil

#if __OBJC2__if (slowpath(checkNil && !cls)) return nil;

__OBJC2__表示仅在OC2.0环境下有效,<!--slowpath用于分支预测优化,提示这个条件大概率为假-->,checkNil && !cls 表示如果要求检查且cls是nil,就直接返回nil。

 if (fastpath(!cls->ISA()->hasCustomAWZ())) {return _objc_rootAllocWithZone(cls, nil);}
#endif

<!--fastpath与slowpath相对,也是用于分支预测优化的,它提示这个条件大概率为真。-->cls->ISA()用于获取类的元类,hasCustomAWZ()用于判断类是否重写了allocWithZone:这个方法,

进入条件语句后,_objc_rootAllocWithZone(cls, nil)是调用runtime的根分配方法 ,分配对象。

如果没有进入这条快路径,就只能走慢路径,发消息调用alloc/allocWithZone:

if (allocWithZone) {return ((id(*)(id, SEL, struct _NSZone *))objc_msgSend)(cls, @selector(allocWithZone:), nil);}

objc_msgSend:是runtime的消息发送函数,cls和@selector(allocWithZone:)是这个函数的两个参数,这条语句前面的部分((id(*)(id, SEL, struct _NSZone *))是在对objc_msgSend:函数进行类型转换,把函数转换成了返回一个id,接收两个参数:id,SEL的函数,这样来正确调用alloc方法。

这条语句就相当于给类对象cls发送alloc消息,从而创建一个该类的实例对象。

最后一种情况是当allocWithZone为假时,正常调用 alloc走常规路径,objc_msgSend: 发送 alloc消息,等效于[cls alloc]

在这里我们对自定义类进行观察,会在这几个分支中走到_objc_rootAllocWithZone,接着我们跳转到_objc_rootAllocWithZone的实现。

再继续跳转到_class_createInstanceFromZone的源码实现,这个部分是alloc源码的核心操作,实现主要分为三个部分:

  • cls->instanceSize:计算需要开辟的<!--内存空间大小-->

  • calloc:<!--申请内存-->,返回地址指针

  • obj->initInstanceIsa:将类与isa关联

static ALWAYS_INLINE id
_class_createInstanceFromZone(Class cls, size_t extraBytes, void *zone,int construct_flags = OBJECT_CONSTRUCT_NONE,bool cxxConstruct = true,size_t *outAllocatedSize = nil)
{ASSERT(cls->isRealized());
​// Read class's info bits all at once for performancebool hasCxxCtor = cxxConstruct && cls->hasCxxCtor();bool hasCxxDtor = cls->hasCxxDtor();bool fast = cls->canAllocNonpointer();size_t size;
​size = cls->instanceSize(extraBytes);if (outAllocatedSize) *outAllocatedSize = size;
​id obj;if (zone) {obj = (id)malloc_zone_calloc((malloc_zone_t *)zone, 1, size);} else {obj = (id)calloc(1, size);}if (slowpath(!obj)) {if (construct_flags & OBJECT_CONSTRUCT_CALL_BADALLOC) {return _objc_callBadAllocHandler(cls);}return nil;}
​if (!zone && fast) {obj->initInstanceIsa(cls, hasCxxDtor);} else {// Use raw pointer isa on the assumption that they might be// doing something weird with the zone or RR.obj->initIsa(cls);}
​if (fastpath(!hasCxxCtor)) {return obj;}
​construct_flags |= OBJECT_CONSTRUCT_FREE_ONFAILURE;return object_cxxConstructFromClass(obj, cls, construct_flags);
}

alloc核心操作

cls->instanceSize(extraBytes)

instanceSize(extraBytes)的实现如下:

instanceSize的调用过程如下:

这里自定义类最终走到fastInstanceSize

在fastInstanceSize中,最终调用的是align16这个函数,在834源码中使用是align16这个函数,在最新版xcode中会报红。

但是可以看到在906源码中其实也调用的是align16这个函数。这个函数的实现是一个16字节对齐算法

这段算法的过程就是将原始的内存 与size_t(15)相加,得到一个数,将 size_t(15) 即 15进行~(取反)操作,再将 这个数 与 15的取反结果 进行 &(与)操作,最后的结果为 16的倍数,即内存的大小是以16的倍数增加的

原理是因为内存必须比数据大,内存对齐的结果只能大于实际数据大小,而不能比它小。将数字加15,使数字大于等于比数据大小要大的最小的那个16的倍数,在和末四位为0的数字进行与操作,抹去后四位,去掉余数,变成16的倍数。

为什么需要内存对齐?

通常内存是由一个个字节组成的,cpu在存取数据时,并不是以字节为单位存储,而是以为单位存取,块的大小为内存存取力度。频繁存取字节未对齐的数据,会极大降低cpu的性能,所以可以通过减少存取次数降低cpu的开销

16字节对齐,是由于在一个对象中,第一个属性isa8字节,当然一个对象肯定还有其他属性,当无属性时,会预留8字节,即16字节对齐,如果不预留,相当于这个对象的isa和其他对象的isa紧挨着,容易造成访问混乱

16字节对齐后,可以加快CPU读取速度,同时使访问更安全,不会产生访问混乱的情况

calloc

calloc函数用于申请内存并返回地址指针

obj = (id)calloc(1, size);

这一行代码就是在用计算出来的size获取地址指针obj,此时地址还没有与传入的cls进行关联。

obj->initInstanceIsa

这一步是在将类与isa关联。内存申请好后,将传入的类与已经申请好的内存进行关联,而关联的方式就是isa指针。关联的流程如下:

在执行完initInstanceIsa后,内存便与类关联了起来。

综上,alloc的核心操作就是三步:计算内存,申请内存,内存与类关联。

init

init有两种,一种是类的init,一种是对象的。

类方法:

+ (id)init {return (id)self;
}

这里的init是一个构造方法 ,是通过工厂设计(工厂方法模式),主要是用于给用户提供构造方法入口。这里能使用id强转的原因,主要还是因为 内存字节对齐后,可以使用类型强转为你所需的类型

实例方法:

init实例方法会跳转到_objc_rootInit方法,来看看它的实现

可以发现,函数返回的是传入的self本身。

new

除了alloc与init,初始化还可以使用new方法

new其实就是调用了callAlloc函数(即alloc中分析的函数)以及init函数,因此就相当于[[ alloc] init]。

但是如果重写了init方法做一些自定义操作,这时会在这个方法中调用[super init],这时不建议使用new进行初始化。

相关文章:

【iOS】alloc init new底层原理

目录 前言 alloc alloc核心操作 cls->instanceSize(extraBytes) calloc obj->initInstanceIsa init 类方法&#xff1a; 实例方法&#xff1a; new 前言 笔者最近在进行对OC语言源码的学习&#xff0c;学习源码的过程中经常会出现一些从来没有遇见过的函数&…...

解决vscode找不到Python自定义模块,报错No module named ‘xxx‘

1、 首先在.vscode下的launch.json中添加"env": {“PYTHONPATH”: “${workspaceRoot}”} {"version": "0.2.0","configurations": [{省略其他配置"env": {"PYTHONPATH": "${workspaceRoot}"}}] }2、 …...

【某比特币网址请求头部sign签名】RSA加密逆向分析

目标&#xff1a;aHR0cDovL21lZ2FiaXQudmlwL21hcmtldA 直接搜索sign不方便定位&#xff0c;可以换个思路搜asi_uuid或者user_info 为什么搜这个&#xff0c;因为都是请求头里面的参数&#xff0c;基本上会在一起 实际上就是Object(h.a)((new Date).getTime()) 直接在这里打断点…...

【Docker项目实战】使用Docker部署Jupyter Notebook服务

【Docker项目实战】使用Docker部署Jupyter Notebook服务 一、 Jupyter Notebook介绍1.1 Jupyter Notebook 简介1.2 主要特点1.3 主要使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compos…...

Oracle高级语法篇 - 用户与角色关系

在Oracle数据库中&#xff0c;用户和角色是权限管理的核心概念。用户是数据库的使用者&#xff0c;而角色则是权限的集合。通过合理地分配角色给用户&#xff0c;可以简化权限管理&#xff0c;提高数据库的安全性和易用性。本文将详细讲解Oracle中用户和角色之间的关系&#xf…...

“小坝” 策略:始发站 buffer 控制与优化

端到端&#xff0c;这两个端是两个应用程序中的位置&#xff0c;第一个端指数据被产生处&#xff0c;第二个端指数据被消费处。更一般的&#xff0c;把数据发生的应用程序所在的主机视为数据始发站也是合理的。 网络中遍布 buffer&#xff0c;buffer 却是一把双刃剑的存在&…...

【esp32 点亮led】-解决不能闪烁问题

问题现象&#xff1a;将esp例程中的led例程下载到开发板中&#xff0c;led不能闪烁&#xff0c;串口查看&#xff0c;可以看到对应的led ON/led off 信息。 解决办法&#xff1a; 使用idf.py menuconfig 命令配置相应的引脚为GPIO模式&#xff0c;如下图所示&#xff0c;保存…...

自然语言处理(9)—— 共现词矩阵及Python实现

共现词矩阵 1. 概述2. 构建步骤3. 代码实现&#xff08;Python&#xff09;结语 共现词矩阵&#xff08;Co-occurrence Matrix&#xff09;是自然语言处理&#xff08;NLP&#xff09;中用于捕捉词语间语义关系的重要工具。共现矩阵通过统计词语在特定上下文窗口内的共现频率&a…...

缓存 --- Redis的三种高可用模式

缓存 --- Redis的三种高可用模式 主从复制&#xff08;Replication&#xff09;哨兵模式&#xff08;Sentinel&#xff09;集群模式&#xff08;Cluster&#xff09;总结对比选择建议 Redis 的高可用架构模式主要有三种&#xff1a;主从复制&#xff08;Replication&#xff09…...

飞帆中控件数据和 Vue 双向绑定

在 Vue 中&#xff0c;数据的双向绑定是指在视图和数据模型之间自动保持同步。Vue 实现双向绑定的核心特性是其 响应式系统&#xff0c;它能够追踪数据的变化并自动更新视图&#xff0c;反之亦然&#xff0c;视图的变化也可以影响数据。 Vue 提供了几种方式来实现数据双向绑定&…...

【外研在线-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

实现AWS Data Pipeline安全地请求企业内部API返回数据

需要编写一段Data Pipeline在AWS云上运行&#xff0c;它需要访问企业内部的API获取JSON格式的数据&#xff0c;企业有网关和防火墙&#xff0c;API有公司的okta身份认证&#xff0c;通过公司的域账号来授权访问&#xff0c;现在需要创建一个专用的域账号&#xff0c;让Data Pip…...

AI书籍大模型微调-基于亮数据获取垂直数据集

大模型的开源&#xff0c;使得每位小伙伴都能获得AI的加持&#xff0c;包括你可以通过AIGC完成工作总结&#xff0c;图片生成等。这种加持是通用性的&#xff0c;并不会对个人的工作带来定制的影响&#xff0c;因此各个行业都出现了垂直领域大模型。 垂直大模型是如何训练出来…...

cloudstudio学习笔记之openwebui

代码获取 git clone 参考资料 openwebui官网 https://docs.openwebui.com/getting-started/advanced-topics/development 后端启动 cd backend pip install -r requirements.txt -U sh dev.sh后端启动成功后的界面 在cloudstudio提供的vscode弹出的提示中打开浏览器并在末…...

Linux安装mysql_exporter

mysqld_exporter 是一个用于监控 MySQL 数据库的 Prometheus exporter。可以从 MySQL 数据库的 metrics_schema 收集指标&#xff0c;相关指标主要包括: MySQL 服务器指标:例如 uptime、version 等数据库指标:例如 schema_name、table_rows 等表指标:例如 table_name、engine、…...

Kubernetes控制平面组件:API Server代码基础概念

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…...

修改PointLIO项目

添加key_frame_info.msg消息 新建.msg文件&#xff0c;内容填写为&#xff1a; # Cloud Info Header header # cloud messages sensor_msgs/PointCloud2 key_frame_cloud_ori sensor_msgs/PointCloud2 key_frame_cloud_transed sensor_msgs/PointCloud2 key_frame_poses其中k…...

将 JSON 字符串转化为对象的详细笔记 (Java示例)

1. 主流 JSON 库的选择 在 Java 中&#xff0c;常用以下库进行 JSON 和对象之间的转换&#xff1a; Jackson&#xff1a;Spring 默认集成&#xff0c;性能优异&#xff0c;支持流式解析。FastJSON&#xff1a;阿里开发&#xff0c;速度快&#xff0c;但需注意版本安全性。Gso…...

基于Docker+k8s集群的web应用部署与监控

项目架构图 server ip master 192.168.140.130 node1 192.168.140.131 node2 192.168.140.132 ansible 192.168.140.166 jumpserver 192.168.100.133 firewall 192.168.1.86 nfs 192.168.140.157 harbor 192.168.140.159 Promethethus 192.168.140.130 Jen…...

Java(自用查看版)

目录 1.java的基本运行 2、基本格式 注释 标识名 关键字 常量 整型常量 浮点数&#xff1a; 字符常量&#xff1a; 字符串常量 布尔 null值 变量 整型变量&#xff1a; 浮点变量: 字符变量: 布尔变量&#xff1a; 类型转换 自动类型转换 强制类型转换 运算符 …...

头歌java课程实验(函数式接口及lambda表达式)

第1关&#xff1a;利用lambda表达式对Book数组按多个字段进行排序 任务描述 本关任务&#xff1a;利用Comparator接口完成对Book数组同时按多个字段进行排序。 编程要求 1、本任务共有三个文件&#xff0c;可查看各文件的内容 2、无需修改SortBy.java枚举文件及Book.java类文…...

Jsp技术入门指南【九】详细讲解JSTL

Jsp技术入门指南【九】详细讲解JSTL 前言一、什么是JSTL&#xff1f;&#xff08;JavaServer Pages Standard Tag Library&#xff09;二、使用JSTL前的准备三、核心标签库常用标签详解1. <c:out>&#xff1a;输出内容&#xff08;替代<% %>&#xff09;2. <c:i…...

【C语言】用铁路系统来类比流,管道,进程,线程,内存,输入输出等

用**铁路网络**来比喻计算机中的这些概念会非常形象。下面是一个完整的类比体系,帮助你直观理解它们之间的关系: --- ### **1. 核心角色对照表** | **计算机概念** | **铁路网络比喻** | |--------…...

PCA——主成分分析数学原理及代码

主成分分析 PCA的目的是&#xff1a;对数据进行一个线性变换&#xff0c;在最大程度保留原始信息的前提下去除数据中彼此相关的信息。反映在变量上就是说&#xff0c;对所有的变量进行一个线性变换&#xff0c;使得变换后得到的变量彼此之间不相关&#xff0c;并且是所有可能的…...

[Windows] Adobe Camera Raw 17.2 win/Mac版本

[Windows] Adobe Camera Raw 链接&#xff1a;https://pan.xunlei.com/s/VOOIAXoyaZcKAkf_NdP-qw_6A1?pwdpd5k# Adobe Camera Raw&#xff0c;支持Photoshop&#xff0c;lightroom等Adobe系列软件&#xff0c;对相片无损格式进行编辑调色。 支持PS LR 2022 2023 2024 2025版…...

基于计算机视觉的行为检测:从原理到工业实践

一、行为检测的定义与核心价值 行为检测(Action Recognition)是计算机视觉领域的关键任务,旨在通过分析视频序列理解人类动作的时空特征。其核心价值体现在时序建模和多尺度分析能力上——系统需要捕捉动作的起始、发展和结束全过程,同时适应不同持续时间(0.1秒至数分钟)…...

基于 OpenCV 的图像与视频处理

基于 OpenCV 的图像处理 一、实验背景 OpenCV 是一个开源的计算机视觉库&#xff0c;广泛应用于图像处理、视频分析、目标检测等领域。通过学习 OpenCV&#xff0c;可以快速实现图像和视频的处理功能&#xff0c;为复杂的应用开发 奠定基础。本实验旨在通过实际代码示例&…...

B树的异常恢复

B-Tree & Crash Recovery B树作为平衡的n叉树 高度平衡树 许多实用的二叉树&#xff08;如AVL树或红黑树&#xff09;被称为高度平衡树&#xff0c;这意味着树的高度&#xff08;从根节点到叶子节点&#xff09;被限制为Ο(log &#x1d441;)&#xff0c;因此查找操作的…...

Centos9 离线安装 MYSQL8

centos 9 离线安装 mysql 8 参考教程 1. 官网下载mysql 下载地址 2. 将文件传输到Centos中解压 软件全部安装到了/opt中 在opt中新建mysql目录&#xff0c;解压到mysql目录中 tar -xvf mysql压缩文件 mysql[rootcentoshost mysql]# ls mysql-community-client-8.4.5-1.e…...

【RabbitMQ | 第2篇】RabbitMQ 控制台实现消息路由 + 数据隔离

文章目录 同步调用和异步调用MQRabbitMQ1. RabbitMQ控制台实现交换机路由到队列1.1 创建队列1.2 将消息发送给交换机&#xff0c;是否会到达队列 2. RabbitMQ控制台实现数据隔离2.1 添加一个用户2.2 创建新的虚拟主机 同步调用和异步调用 同步调用是指完成一个功能&#xff0c…...

算法—选择排序—js(场景:简单实现,不关心稳定性)

选择排序原理&#xff1a;&#xff08;简单但低效&#xff09; 每次从未排序部分选择最小元素&#xff0c;放到已排序部分的末尾。 特点&#xff1a; 时间复杂度&#xff1a;O(n) 空间复杂度&#xff1a;O(1) 不稳定排序 // 选择排序 function selectionSort(arr) {for (let …...

龙舟中国行走进湖南娄底 2025湖南省龙舟联赛娄底站盛大举行

鼓声震天破碧波&#xff0c;百舸争流显豪情。2025年4月20日星期日&#xff0c;"龙舟中国行2025"首站——龙舟中国行走进湖南娄底2025湖南省龙舟联赛娄底双峰站在双峰县湄水河育才桥至风雨桥水域火热开赛。12支劲旅劈波斩浪&#xff0c;在青山绿水间上演传统与现代交织…...

重构之去除多余的if-else

一、提前返回&#xff08;Guard Clauses&#xff09; 适用场景&#xff1a;当 else 块仅用于处理异常或边界条件时。 优化前&#xff1a;if (isValid) {doSomething(); } else {return; }优化后&#xff1a;if (!isValid) return; // 提前处理异常&#xff0c;主流程保持简洁…...

【Vim】vim的简单使用

文章目录 1. vi的模式2. 按键使用说明2.1 一般命令模式光标移动替换和查找删除/复制/粘贴 2.2 编辑模式插入/替换 2.3 命令行模式保存/退出环境修改 3. vim的缓存4. vim可视区块5. vim多文件编辑6. vim多窗口功能7. vim关键词补全 1. vi的模式 一般命令模式&#xff1a;以vi打…...

【消息队列RocketMQ】一、RocketMQ入门核心概念与架构解析

在当今互联网技术飞速发展的时代&#xff0c;分布式系统的架构设计愈发复杂。消息队列作为分布式系统中重要的组件&#xff0c;在解耦应用、异步处理、削峰填谷等方面发挥着关键作用。RocketMQ 作为一款高性能、高可靠的分布式消息中间件&#xff0c;被广泛应用于各类互联网场景…...

hadoop分布式部署

1. 上传jdk和hadoop安装包到服务器 2. 解压压缩包 tar xf jdk1.8.0_112.tgz -C /usr/local/ tar xf hadoop-3.3.6.tar.gz -C /usr/local/3. 关闭防火墙 systemctl stop firewalld systemctl disable firewalld4. 修改配置文件 core-site.xml、hadoop-env.sh、yarn-env.sh、…...

C++面试题集合(附答案)

C全家桶 C基础 1. C和C有什么区别&#xff1f; 2. C语言的结构体和C的有什么区别&#xff1f; 3. C 语言的关键字 static 和 C 的关键字 static 有什么区别&#xff1f; 4. C 和 Java有什么核心区别&#xff1f; 5. C中&#xff0c;a和&a有什么区别&#xff1f; 6. …...

23种设计模式-结构型模式之装饰器模式(Java版本)

Java 装饰器模式&#xff08;Decorator Pattern&#xff09;详解 &#x1f381; 什么是装饰器模式&#xff1f; 装饰器模式是一种结构型设计模式&#xff0c;允许向一个对象动态添加新的功能&#xff0c;而不改变其结构。 &#x1f9f1; 你可以想象成在原有功能上“包裹”一…...

UE5的BumpOffset节点

BumpOffset 节点的基本概念 本质上&#xff0c;BumpOffset 节点通过扭曲或偏移纹理坐标来创造深度错觉。它基于视角方向和高度信息动态地调整纹理采样位置&#xff0c;使平面表面看起来具有凹凸感。这是一种称为视差映射(Parallax Mapping)的技术的实现。 当你从不同角度观察…...

从跌倒到领跑:北京亦庄机器人马拉松如何改写人机协作未来?

目录 一、当铁骨遇见马拉松精神 二、半马背后的硬核突破 三、赛事背后的科技博弈 四、当机器人走出实验室 跌倒者的荣光 清晨7:30的南海子公园,发令枪响瞬间——20台形态各异的机器人以千奇百怪的姿态冲出起跑线,有的像蹒跚学步的孩童,有的如专业运动员般矫健,更有机器…...

Internet Protocol

一、IP 1. 基本概念 IP定义&#xff1a;IP 是为计算机网络相互连接进行通信而设计的协议&#xff0c;它规定了网络设备如何标识和寻址&#xff0c;以及数据如何在网络中传输和路由。IP作用&#xff1a;主要负责在不同的网络之间转发数据包&#xff0c;使数据能够从源主机准确…...

Android学习之实战登录注册能力

我们可以从本地 Token 存储、时效管理、服务端通知联动、定时器优化四个维度深入展开 一、本地 Token 存储设计&#xff08;基于 SharedPreferences&#xff09; 1. 存储结构优化&#xff08;包含时效性字段&#xff09; // 定义存储类&#xff08;封装SharedPreferences操作…...

【数据可视化-19】智能手机用户行为可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...

基于一致性哈希算法原理和分布式系统容错机制

一、传统取模算法的局限性分析 当使用User ID取模路由时&#xff0c;Pod挂断会导致以下问题&#xff1a; 数据雪崩效应&#xff1a;节点失效后所有请求需要重新计算取模值&#xff0c;导致缓存穿透和服务震荡服务不可用窗口&#xff1a;节点失效期间&#xff0c;原本路由到该节…...

[SpringBoot-1] 概述和快速入门(使用vscode)

1 SpringBoot 概念 SpringBoot提供了一种快速使用Spring的方式&#xff0c;基于约定优于配置的思想&#xff0c;可以让开发人员不必在配置与逻辑业务之间进行思维的切换&#xff0c;全身心的投入到逻辑业务的代码编写中&#xff0c;从而大大提高了开发的效率&#xff0c;一定程…...

学习笔记二十——Rust trait

&#x1f9e9; Rust Trait 彻底搞懂版 &#x1f440; 目标读者&#xff1a;对 Rust 完全陌生&#xff0c;但想真正明白 “Trait、Trait Bound、孤岛法则” 在做什么、怎么用、为什么这样设计。 &#x1f6e0; 方法&#xff1a; 先给“心里模型”——用生活类比把抽象概念掰开揉…...

llama factory

微调大模型可以像这样轻松… https://github.com/user-attachments/assets/e6ce34b0-52d5-4f3e-a830-592106c4c272 选择你的打开方式&#xff1a; 入门教程&#xff1a;https://zhuanlan.zhihu.com/p/695287607框架文档&#xff1a;https://llamafactory.readthedocs.io/zh-…...

机器学习 Day12 集成学习简单介绍

1.集成学习概述 1.1. 什么是集成学习 集成学习是一种通过组合多个模型来提高预测性能的机器学习方法。它类似于&#xff1a; 超级个体 vs 弱者联盟 单个复杂模型(如9次多项式函数)可能能力过强但容易过拟合 组合多个简单模型(如一堆1次函数)可以增强能力而不易过拟合 集成…...

基于 Spring Boot 瑞吉外卖系统开发(五)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;五&#xff09; 删除分类 分类列表中每条分类信息右侧提供了一个“删除”按钮&#xff0c;当需要将已经存在的分类信息删除时&#xff0c;可以通过单击“删除”按钮实现。 请求路径为/category&#xff0c;携带参数id&#xf…...

PyTorch基础笔记

PyTorch张量 多维数组&#xff1a;张量可以是标量&#xff08;0D&#xff09;、向量&#xff08;1D&#xff09;、矩阵&#xff08;2D&#xff09;或更高维的数据&#xff08;3D&#xff09;。 数据类型&#xff1a;支持多种数据类型&#xff08;如 float32, int64, bool 等&a…...