【C/C++】C++中noexcept的妙用与性能提升
文章目录
- C++中noexcept的妙用与性能提升
- 1 什么情况下会抛出异常
- 2 标记noexcept作用
- 3 何时使用`noexcept`
- 4 无异常行为标记场景
- 5 一句话总结
C++中noexcept的妙用与性能提升
在C++中,noexcept
修饰符用于指示函数不会抛出异常
1 什么情况下会抛出异常
在 C++ 中,异常(Exception)是程序在运行时遇到错误或意外情况时的一种错误处理机制。
- 显式抛出异常(
throw
关键字)
通过throw
手动抛出异常,可以是标准库异常类型或自定义类型:
#include <stdexcept>void validate(int value) {if (value < 0) {throw std::invalid_argument("Value cannot be negative!");}
}int main() {try {validate(-5);} catch (const std::exception& e) {std::cerr << "Error: " << e.what() << std::endl; // 输出错误信息}
}
- 标准库函数抛出的异常
C++ 标准库中的许多操作在失败时会抛出预定义的异常类型:
-
内存分配失败
new
在内存不足时抛出std::bad_alloc
:
try {int* arr = new int[1000000000000]; // 尝试分配超大内存 } catch (const std::bad_alloc& e) {std::cerr << "Memory allocation failed: " << e.what() << std::endl; }
-
容器越界访问
std::vector::at()
在索引越界时抛出std::out_of_range
:
std::vector<int> vec = {1, 2, 3}; try {int val = vec.at(10); // 越界访问 } catch (const std::out_of_range& e) {std::cerr << "Out of range: " << e.what() << std::endl; }
-
类型转换失败
dynamic_cast
在向下转型失败时(对引用类型)抛出std::bad_cast
:
class Base { virtual void foo() {} }; class Derived : public Base {};Base base; try {Derived& d = dynamic_cast<Derived&>(base); // 转型失败(引用类型) } catch (const std::bad_cast& e) {std::cerr << "Bad cast: " << e.what() << std::endl; }
- 标准库中的其他异常
- 数学运算错误:如
std::overflow_error
、std::underflow_error
(需手动检查或使用特定函数)。 - 文件操作失败:
std::ifstream
或std::ofstream
在文件无法打开时可能抛出异常(需启用异常标志):
std::ifstream file;
file.exceptions(std::ifstream::failbit); // 启用异常
try {file.open("nonexistent.txt");
} catch (const std::ios_base::failure& e) {std::cerr << "File error: " << e.what() << std::endl;
}
- 动态类型信息异常
- 使用
typeid
操作符时,若操作数为空指针(nullptr
),可能抛出std::bad_typeid
:
class MyClass { virtual ~MyClass() {} };
MyClass* ptr = nullptr;try {std::cout << typeid(*ptr).name() << std::endl; // 解引用空指针
} catch (const std::bad_typeid& e) {std::cerr << "Bad typeid: " << e.what() << std::endl;
}
- 线程和并发相关异常
- 若
std::thread
的析构函数被调用时,线程仍在运行且未被join()
或detach()
,程序会终止(通过std::terminate
):
#include <thread>void thread_func() { /* ... */ }int main() {std::thread t(thread_func);// 未调用 t.join() 或 t.detach() 直接退出作用域 -> 触发 std::terminate
}
- 自定义异常
可以继承std::exception
或其派生类定义自己的异常类型:
#include <exception>class MyException : public std::runtime_error {
public:MyException(const std::string& msg) : std::runtime_error(msg) {}
};void process() {throw MyException("Custom error occurred!");
}int main() {try {process();} catch (const MyException& e) {std::cerr << "Custom error: " << e.what() << std::endl;}
}
异常安全注意事项
- 资源泄漏风险:若在异常抛出前未正确释放资源(如内存、文件句柄),可能导致泄漏。应使用 RAII(如智能指针、
std::lock_guard
)确保资源自动释放。 - 移动和拷贝操作:若对象的移动构造函数可能抛出异常,标准库容器可能回退到拷贝操作(参考
noexcept
优化)。
常见误区
-
dynamic_cast
对指针和引用的不同行为:- 对指针类型失败时返回
nullptr
,不抛出异常。 - 对引用类型失败时抛出
std::bad_cast
。
- 对指针类型失败时返回
-
noexcept
函数中的异常:- 若
noexcept
函数内部抛出异常,程序直接终止(调用std::terminate
)。
- 若
结合上述异常情景,可以总结出:C++ 中的异常通常由以下情况触发:
- 显式
throw
语句。 - 标准库函数在特定错误条件下抛出异常(如内存不足、越界访问)。
- 动态类型转换失败(对引用类型)。
- 自定义异常类的抛出。
最佳实践:
- 优先使用标准库异常类型(如
std::runtime_error
)。 - 确保异常安全(通过 RAII 管理资源)。
- 谨慎使用
noexcept
,仅在确定函数不抛异常时使用。
2 标记noexcept作用
- 性能优化
- 减少异常处理开销:编译器在生成代码时,若函数标记为
noexcept
,可以省略异常处理的相关机制(如栈展开代码),从而减少生成代码的体积并提升运行效率。 - 移动语义优化:标准库容器(如
std::vector
)在重新分配内存时,若元素的移动操作(如移动构造函数)被标记为noexcept
,则优先使用移动而非拷贝。例如:
此时,class MyClass { public:MyClass(MyClass&& other) noexcept { /* ... */ } // 移动构造函数标记为noexcept };
std::vector<MyClass>
在扩容时会高效地移动元素而非拷贝。
- 标准库行为控制
- 容器操作的异常安全:标准库的某些操作(如
std::vector::push_back
)会根据类型是否支持noexcept
移动来决定使用移动还是拷贝。若移动操作可能抛出异常(未标记noexcept
),为保障异常安全,标准库会回退到拷贝操作。
- 接口明确性
- 契约式设计:
noexcept
作为函数签名的一部分,明确告知调用者该函数不会抛出异常,增强代码可读性和可靠性。例如:void safe_operation() noexcept; // 明确承诺不抛异常
- 错误处理约束
- 强制终止异常传播:若
noexcept
函数内部抛出异常,程序会直接调用std::terminate()
终止,避免异常传播导致未定义行为。例如:
开发者需确保void risky() noexcept {throw std::runtime_error("oops"); // 触发程序终止 }
noexcept
函数确实不会抛出异常。
- 虚函数与继承
- 异常规范一致性:派生类重写的虚函数必须与基类的异常说明兼容。若基类虚函数为
noexcept
,派生类版本也需标记noexcept
:class Base { public:virtual void func() noexcept {} }; class Derived : public Base { public:void func() noexcept override {} // 必须同样标记noexcept };
- 条件性
noexcept
- 动态异常说明:通过
noexcept(condition)
根据编译期条件决定是否禁止异常:template<typename T> void swap(T& a, T& b) noexcept(noexcept(T(std::move(a))) && noexcept(a.operator=(std::move(b)))) {// 当T的移动构造和移动赋值为noexcept时,swap才为noexcept }
3 何时使用noexcept
-
移动构造函数/赋值运算符(标准库优化的关键)。
-
简单函数(如
getter
、资源释放函数)。 -
标准库要求或可显著提升性能的场景。
-
注意事项
- 谨慎使用:错误标记
noexcept
可能导致程序意外终止。 - 析构函数:默认隐式
noexcept
,若需允许析构函数抛出异常,需显式标记noexcept(false)
(但通常不推荐)。
- 谨慎使用:错误标记
4 无异常行为标记场景
- 红黑树代码片段
// 此函数确实不抛异常,标记 `noexcept` 是安全的。static _Const_Base_ptr_S_minimum(_Const_Base_ptr __x) _GLIBCXX_NOEXCEPT{while (__x->_M_left != 0) __x = __x->_M_left;return __x;}
- 无显式
throw
:函数体无手动抛出异常。 - 无潜在异常操作:
__x->_M_left
解引用指针,但_M_left
是内置指针类型(非可能抛异常的智能指针或重载operator->
)。- 指针比较(
__x->_M_left != 0
)和赋值(__x = __x->_M_left
)均为基本操作,不会抛出异常。
- 循环终止性:只要树结构合法(左子树有限),循环必然终止,无无限循环风险。
在C++中,即使一个函数本身没有显式抛出异常或调用可能抛出异常的操作,标记为 noexcept
仍然可能出于以下原因:
- 标准库内部的性能优化要求
标准库的某些操作(如容器扩容、节点调整)会根据成员函数是否noexcept
选择优化策略:
- 移动语义优化:若函数(如移动构造函数)标记为
noexcept
,标准库会优先使用移动而非拷贝,避免潜在的性能损失。 - 异常安全性保证:标准库需要确保在调整数据结构时,基本操作(如节点查找)不会抛出异常,从而避免破坏容器的不变量(invariants)。
例如,std::vector
在扩容时,若元素类型的移动操作是 noexcept
,则使用移动;否则回退到拷贝。类似地,此处的 _S_minimum
若被标记为 noexcept
,可能允许上层操作(如树的重新平衡)安全地依赖它。
- 编译器优化
标记为noexcept
的函数会触发编译器的优化机制:
- 省略异常处理代码:编译器无需生成栈展开(stack unwinding)逻辑,减少生成的机器码体积,提升运行效率。
- 内联可能性:简单的
noexcept
函数更易被内联,进一步减少调用开销。
此函数仅遍历左子节点,逻辑简单且无复杂操作,标记 noexcept
后可能被编译器深度优化。
- 接口契约与代码规范
- 明确承诺不抛异常:即使当前实现无异常,标记
noexcept
是对调用者的严格约定,表明开发者保证未来修改也不会引入异常。 - 代码可维护性:强制后续维护者遵守不抛异常的约束,若误添加可能抛异常的操作,编译器会报错。
- 适配模板元编程需求
此函数可能是模板或泛型代码的一部分,某些模板可能要求传入的操作是noexcept
的。例如:
template<typename Func>
void process(Func f) noexcept(noexcept(f())) {// 若 f() 为 noexcept,则 process 也为 noexceptf();
}
若 _S_minimum
被此类模板使用,则需明确标记 noexcept
以满足编译期条件。
- 标准库实现惯例
在标准库(如 libstdc++)的实现中,底层工具函数通常默认标记为noexcept
,除非明确可能抛异常。这是为了:
- 统一代码风格:保持内部函数异常说明的一致性。
- 防御性编程:避免因未预料的操作(如自定义类型的
operator->
重载抛出异常)导致问题。但此例中__x->_M_left
是内置指针操作,无重载风险,故安全。
- 汇总
此函数标记noexcept
的主要原因包括:- 标准库优化:允许依赖它的上层操作(如容器调整)选择高效路径。
- 编译器优化:减少异常处理开销,提升性能。
- 接口契约:明确承诺不抛异常,增强代码可靠性。
- 代码规范:遵循标准库内部实现惯例。
即使函数本身无显式异常,noexcept
在底层代码中仍是关键优化和设计手段。
5 一句话总结
noexcept
通过指导编译器和标准库优化,提升程序性能与可靠性,但需在充分确保函数无异常抛出的前提下使用。
相关文章:
【C/C++】C++中noexcept的妙用与性能提升
文章目录 C中noexcept的妙用与性能提升1 什么情况下会抛出异常2 标记noexcept作用3 何时使用noexcept4 无异常行为标记场景5 一句话总结 C中noexcept的妙用与性能提升 在C中,noexcept修饰符用于指示函数不会抛出异常 1 什么情况下会抛出异常 在 C 中,异…...
增强学习(Reinforcement Learning)简介
增强学习(Reinforcement Learning)简介 增强学习是机器学习的一种范式,其核心目标是让智能体(Agent)通过与环境的交互,基于试错机制和延迟奖励反馈,学习如何选择最优动作以最大化长期累积回报。…...
如何优化系统启动时间--基于米尔瑞萨MYD-YG2LX开发板
1.概述 MYD-YG2LX采用瑞萨RZ/G2L作为核心处理器,该处理器搭载双核Cortex-A551.2GHzCortex-M33200MHz处理器,其内部集成高性能3D加速引擎Mail-G31 GPU(500MHz)和视频处理单元(支持H.264硬件编解码),16位的DDR4-1600 / DDR3L-1333内…...
.Net HttpClient 概述
HttpClient 概述 作用 HttpClient是一个用于发送HTTP请求和接收HTTP响应的类。它提供了一种现代化、灵活和强大的方式来与Web服务进行通信。HttpClient类位于System.Net.Http命名空间下,可以通过NuGet包管理器进行安装。 整体理解 HttpClient是应用程序进程中&am…...
明远智睿SSD2351开发板:仪器仪表与智慧农业的创新利器
在仪器仪表和智慧农业领域,对设备的精度、稳定性和智能化程度有着较高的要求。明远智睿的SSD2351开发板以其独特的优势,成为这两个领域的创新利器。 在仪器仪表方面,SSD2351开发板的四核1.4GHz处理器能够快速处理仪器仪表采集到的各种数据&am…...
VBA -- 学习Day4
数组 创建数组: Dim 数组名(数组元素上下角标)[As 元素类型] eg. Dim MyArray (1 To 3) As Integer 注意:1.如果不指定元素类型,则是Variant类型 向数组赋值: eg. MyArray(1) 100 MyArray(2) 200…...
Nacos源码—7.Nacos升级gRPC分析四
大纲 5.服务变动时如何通知订阅的客户端 6.微服务实例信息如何同步集群节点 6.微服务实例信息如何同步集群节点 (1)服务端处理服务注册时会发布一个ClientChangedEvent事件 (2)ClientChangedEvent事件的处理源码 (3)集群节点处理数据同步请求的源码 (1)服务端处理服务注册…...
Linux 学习笔记2
Linux 学习笔记2 一、定时任务调度操作流程注意事项 二、磁盘分区与管理添加新硬盘流程磁盘管理命令 三、进程管理进程操作命令服务管理(Ubuntu) 四、注意事项 一、定时任务调度 操作流程 创建脚本 vim /path/to/script.sh # 编写脚本内容设置可执行权…...
一、每日Github软件分享----QuickGo外链直达工具
QuickGo 是一款专注于提升网页浏览效率的浏览器扩展工具,其核心功能是自动绕过网站的安全跳转限制,让用户点击外链时无需手动确认,直接跳转至目标页面。以下是详细功能介绍与分析: 一、核心功能与亮点 极速跳转 通过优化浏览器 AP…...
【软件测试】软件缺陷(Bug)的详细描述
目录 一、软件缺陷(Bug) 1.1 缺陷的判定标准 1.2 缺陷的生命周期 1.3 软件缺陷的描述 1.3.1 提交缺陷的要素 1.3.2 Bug 的级别 1.4 如何发现更多的 Bug? 1.5 缺陷的有效管理 1.5.1 缺陷的编写 1.5.2 缺陷管理工具 1.5.2.1 缺陷管理 1.5.2.2 用例管理 一、软件缺陷…...
C++ stl中的list的相关函数用法
文章目录 list的介绍list的使用定义方式 插入和删除迭代器的使用获取元素容器中元素个数和容量的控制其它操作函数 list的使用,首先要包含头文件 #include <list>list的介绍 1.list是一种可以在常数范围内在链表中的任意位置进行插入和删除的序列式容器&…...
Cmd命令大全,从入门到放弃
1、文件和目录操作 dir /p:分页显示目录内容。 dir /w:以单行显示目录内容。 dir /s:显示指定目录及子目录下的所有文件。 dir /b:仅显示文件和目录名称。 dir /a:显示具有特定属性的文件和目录。 cd /d:改变当前驱动器。 pushd:将当前目录压入堆栈,并切换到指定…...
数据同步选择推Push还是拉Pull
数据同步选择“推”(Push)还是“拉”(Pull”,要根据实际场景、系统架构和对实时性、资源消耗、安全性的需求来决定。下面是两种方式的对比分析,帮你更好地判断: 文章目录 推模式(Pushÿ…...
Kafka集群加入新Broker节点会发生什么
Kafka集群加入新Broker节点会发生什么 当向现有的Kafka集群添加新的Broker节点时,会触发一系列自动和手动的过程。以下是详细的流程和影响: 自动发生的流程 集群发现与注册 新Broker启动时会向ZooKeeper注册自己加入集群的/brokers/ids路径下其他Broke…...
【LeetCode Solutions】LeetCode 176 ~ 180 题解
CONTENTS LeetCode 176. 第二高的薪水(SQL 中等)LeetCode 177. 第 N 高的薪水(SQL 中等)LeetCode 178. 分数排名(SQL 中等)LeetCode 179. 最大数(中等)LeetCode 180. 连续出现的数字…...
Sourcetree安装使用的详细教程
Sourcetree 是由 Atlassian 推出的 免费 Git 图形化客户端,支持 Git 和 Mercurial 仓库管理,适用于 Windows 和 macOS。 一、安装教程 1. 下载 官网地址:Sourcetree | Free Git GUI for Mac and Windows 选择你的平台下载安装包࿰…...
对比学习入门
Yann Lecun在NIPS 2016上提出了著名的“蛋糕比喻”:如果智能是一个蛋糕,蛋糕上的大部分是无监督学习(unsupervised learning),蛋糕上的糖霜是监督学习(supervised learning),而蛋糕上…...
Starrocks 的 ShortCircuit短路径
背景 本文基于 Starrocks 3.3.5 本文主要来探索一下Starrocks在FE端怎么实现 短路径,从而加速点查查询速度。 在用户层级需要设置 enable_short_circuit 为true 分析 数据流: 直接到StatementPlanner.createQueryPlan方法: ... OptExpres…...
Windows远程访问Ubuntu的方法
要在Windows上远程访问Ubuntu系统,以下是几种常见的方法: SSH (Secure Shell):通过Windows命令行远程连接到Ubuntu。 在Ubuntu上,确保安装并启用了SSH服务(通常可以通过sudo apt update && sudo apt install openssh-serv…...
23种设计模式-行为型模式之模板方法模式(Java版本)
Java 模板方法模式(Template Method Pattern)详解 🧠 什么是模板方法模式? 模板方法模式是一种行为型设计模式,定义了一个操作中的算法骨架,将一些步骤的实现延迟到子类中。通过模板方法模式,…...
(undone) MIT6.S081 Lec17 VM for APP 学习笔记
url: https://mit-public-courses-cn-translatio.gitbook.io/mit6-s081/lec17-virtual-memory-for-applications-frans/17.1-ying-yong-cheng-xu-shi-yong-xu-ni-nei-cun-suo-xu-yao-de-te-xing 17.1 应用程序使用虚拟内存所需要的特性 今天的话题是用户应用程序使用的虚拟内存…...
值拷贝、浅拷贝和深拷贝
✅ 一、基本概念 1. 值拷贝(Value Copy) 含义:将一个变量的值完整复制到另一个变量中。 对象级别表现:调用的是拷贝构造函数(copy constructor)。 特点:对基本类型或不含动态资源的对象&…...
JWT原理及工作流程详解
JSON Web Token(JWT)是一种开放标准(RFC 7519),用于在各方之间安全传输信息。其核心原理是通过结构化、签名或加密的JSON对象实现无状态身份验证和授权。以下是JWT的工作原理和关键组成部分: 1. JWT结构 J…...
广西某建筑用花岗岩矿自动化监测
1. 项目简介 某矿业有限公司成立于2021年,是由某建筑材料有限公司与个人共同出资成立,矿区面积0.4069平方公里,可开采筑用花岗岩、建筑用砂岩。建筑用花岗岩、建筑用砂岩可利用资源量分别为6338.69万吨、303.39万吨,设计生产规模…...
100个思维模型系列更新完毕!
giszz的粉丝们,到今天为止,思维模型专栏已经更新了100期,正式告一段落了。 以下是为你列出的100个思维模型名字(部分思维模型可能存在多种表述方式,但核心概念一致,这里尽量涵盖不同领域常见的思维模型&am…...
Bitcoin跨链协议Clementine的技术解析:重构DeFi生态的信任边界
2025年5月2日,比特币Rollup项目Citrea在测试网正式推出跨链协议Clementine,其基于BitVM2编程语言构建的信任最小化桥接技术,被视为解决比特币与DeFi生态融合难题的关键突破。本文从技术背景、核心机制、安全模型、应用场景四大维度࿰…...
北斗导航 | RTKLib中重难点技术,公式,代码
Rtklib 一、抗差自适应卡尔曼滤波1. **核心难点**2. **公式与代码实现**二、模糊度固定与LAMBDA算法1. **核心难点**2. **LAMBDA算法实现**3. **部分模糊度固定技术**三、伪距单点定位与误差修正1. **多系统多频点修正**2. **接收机钟差与系统间偏差**四、动态模型与周跳处理1.…...
C++学习之类和对象_1
1. 面向过程与面向对象 C语言是面向过程的,注重过程,通过调用函数解决问题。 比如做番茄炒蛋:买番茄和鸡蛋->洗番茄和打鸡蛋->先炒蛋->把蛋放碟子上->炒番茄->再把蛋倒回锅里->加调料->出锅 而C是面向对象的ÿ…...
Oracle OCP认证考试考点详解083系列14
题记: 本系列主要讲解Oracle OCP认证考试考点(题目),适用于19C/21C,跟着学OCP考试必过。 66. 第66题: 题目 解析及答案: 当一个非常大的数据文件被划分为四个部分进行 RMAN 多区段备份时,以下…...
华为欧拉(EulerOS)系统全栈软件部署指南:从 Redis 到 MySQL 实战详解
前言 在国产化操作系统蓬勃发展的背景下,华为欧拉(EulerOS)凭借其稳定性与安全性,成为企业级服务器部署的重要选择。本文基于官方技术文档与最佳实践,详细梳理 Redis 集群、RabbitMQ、JDK、Tomcat 及 MySQL 在欧拉系统…...
YOLO使用CableInspect-AD数据集实现输电线路缺陷检测
输电线路缺陷检测是一个关键的任务,旨在确保电力传输系统的可靠性和安全性。今天我们使用CableInspect-AD数据集进行训练完成缺陷检测,下载的数据集格式如下: 我们需要经过以下步骤: COCO转YOLO 首先是将COCO格式的数据转换为YO…...
全国青少年信息素养大赛 Python编程挑战赛初赛 内部集训模拟试卷五及详细答案解析
博主推荐 所有考级比赛学习相关资料合集【推荐收藏】1、Python比赛 信息素养大赛Python编程挑战赛 蓝桥杯python选拔赛真题详解...
三个线程 a、b、c 并发运行,b,c 需要 a 线程的数据如何解决
说明: 开发中经常会碰到线程并发,但是后续线程需要等待第一个线程执行完返回结果后,才能再执行后面线程。 如何处理呢,今天就介绍两种方法 1、使用Java自有的API即CountDownLatch,进行实现 思考:CountDown…...
python实现点餐系统
使用python实现点餐系统的增加菜品及价格,删除菜品,查询菜单,点菜以及会员折扣价等功能。 代码: 下面展示一些 内联代码片。 # coding utf-8menu {拍黄瓜: 6, 小炒肉: 28, 西红柿炒蛋: 18, 烤鱼: 30, 红烧肉: 38, 手撕鸡: 45,…...
力扣26——删除有序数组中的重复项
目录 1.题目描述: 2.算法分析: 3.代码展示: 1.题目描述: 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对…...
A2A与MCP定义下,User,Agent,api(tool)间的交互流程图
官方图: 流程图: #mermaid-svg-2smjE8VYydjtLH0p {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-2smjE8VYydjtLH0p .error-icon{fill:#552222;}#mermaid-svg-2smjE8VYydjtLH0p .error-tex…...
【大模型面试每日一题】Day 13:数据并行与模型并行的区别是什么?ZeRO优化器如何结合二者?
【大模型面试每日一题】Day 13:数据并行与模型并行的区别是什么?ZeRO优化器如何结合二者? 📌 题目重现 🌟🌟 面试官:数据并行与模型并行的区别是什么?ZeRO优化器如何结合二者&…...
各种注解含义及使用
RestController RestController注解 是Spring 4.0引入的一个组合注解,用于简化RESTful Web服务的开发。 RestController注解 相当于 Controller 和 ResponseBody 注解的组合,表示该类是一个控制器,并且所有的方法返回值都将直接写入HTTP响应体…...
amass:深入攻击面映射和资产发现工具!全参数详细教程!Kali Linux教程!
简介 OWASP Amass 项目使用开源信息收集和主动侦察技术执行攻击面网络映射和外部资产发现。 此软件包包含一个工具,可帮助信息安全专业人员使用开源信息收集和主动侦察技术执行攻击面网络映射并执行外部资产发现。 使用的信息收集技术 技术数据来源APIs…...
xxl-job简单入门使用教程
1、从git中拉取xxl-job代码 https://gitee.com/xuxueli0323/xxl-job HTTPS:git clone https://gitee.com/xuxueli0323/xxl-job.git SSH:git clone gitgitee.com:xuxueli0323/xxl-job.git 拉取本地后,使用Idea打开项目,当前使用…...
设置GO程序在离线情况下读取本地缓存的模块
在 Go 中,GOPROXY 环境变量用于指定模块代理服务器的地址。如果你想让 GOPROXY 读取本地的模块,可以通过以下几种方式实现: 1. 使用本地代理服务器 你可以搭建一个本地的 Go 模块代理服务器,将需要的模块代码推送到代理服务器中…...
Python 爬虫基础入门教程(超详细)
一、什么是爬虫? 网络爬虫(Web Crawler),又称网页蜘蛛,是一种自动抓取互联网信息的程序。爬虫会模拟人的浏览行为,向网站发送请求,然后获取网页内容并提取有用的数据。 二、Python爬虫的基本原…...
C语言实现三子棋
目录 1.通过模块化来实现三子棋 2.三子棋代码基本逻辑 3.代码的书写 第一步: 第二步: 第三步: 第四步: gane.h gane.c main.c 第五步: game.h game.c main.c 第六步: game.h game.c main…...
SCDN是什么?
SCDN是安全内容分发网络的简称,它在传统内容分发网络(CDN)的基础上,集成了安全防护能力,旨在同时提升内容传输速度和网络安全性。 SCDN的核心功能有: DDoS防御:识别并抵御大规模分布式拒绝服务…...
Transformer编码器+SHAP分析,模型可解释创新表达!
目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基本介绍 基于SHAP分析的特征选择和贡献度计算,Matlab2023b代码实现;基于MATLAB的SHAP可解释Transformer编码器回归模型,敏感性分析方法。 详细介绍 引言 在正向渗透(…...
机器学习第三讲:监督学习 → 带答案的学习册,如预测房价时需要历史价格数据
机器学习第三讲:监督学习 → 带答案的学习册,如预测房价时需要历史价格数据 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署࿱…...
【TACD模拟】质子辐照对GaN器件临界电压增加的影响机制
2013 年,佛罗里达大学的 Erin Patrick 等人基于 TRIM 和 FLOODS 模型,研究了质子辐照对 AlGaN/GaN HEMTs 的影响。研究背景方面,AlGaN/GaN HEMTs 因其宽禁带、高击穿场、高电子迁移率以及优秀的热管理能力,在商业和军事领域应用前景广阔,但长期可靠性仍是问题,尤其是栅极…...
VBA高级应用30例应用4:利用屏蔽事件来阻止自动运行事件
《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以…...
基于SSM实现的健身房系统功能实现八
一、前言介绍: 1.1 项目摘要 随着社会的快速发展和人们健康意识的不断提升,健身行业也在迅速扩展。越来越多的人加入到健身行列,健身房的数量也在不断增加。这种趋势使得健身房的管理变得越来越复杂,传统的手工或部分自动化的管…...
Java设计模式之原型模式详解:从入门到精通
1. 原型模式概述 1.1 定义与核心概念 **原型模式(Prototype Pattern)**是一种创建型设计模式,它通过复制现有对象来创建新对象,而不是通过new关键字实例化。这种模式特别适用于创建成本较高的对象。 专业术语解释表: 术语解释原型(Prototype)被复制的原始对象克隆(Clone)…...