【C/C++】C++中constexpr与const的深度对比
文章目录
- C++中constexpr与const的深度对比
- 1. 编译期确定性
- 2. 更严格的优化保证
- 3. 适用范围更广
- 4. 类型安全与错误检查
- 5. 现代 C++ 的演进方向
- 何时使用 `const`?
- constexpr应用场景
- 1. 配置常量与全局参数
- 2. 数据验证与业务规则检查
- 3. 数学计算与业务逻辑优化
- 4. 模板元编程与类型选择
- 5. 容器与数据结构的编译期初始化
- 6. 业务算法优化
- 7. 业务逻辑的条件编译
- 8. 业务协议解析优化
- 总结
C++中constexpr与const的深度对比
const
和 constexpr
都用于定义常量,但它们的语义和适用场景有显著区别。
1. 编译期确定性
-
constexpr
强制要求值在 编译期 确定,确保常量可以用于需要编译期已知值的场景(如数组大小、模板参数、static_assert
等)。constexpr int size = 10; // 编译期常量 int arr[size]; // 合法:数组大小需编译期确定
-
const
仅表示“不可修改”,但值可能在 运行时 初始化(取决于上下文)。const int size = get_runtime_value(); // 可能在运行时初始化 int arr[size]; // 错误:数组大小必须是编译期常量
2. 更严格的优化保证
-
constexpr
允许编译器在编译期完成计算,减少运行时开销。constexpr int factorial(int n) {return (n <= 1) ? 1 : n * factorial(n - 1); } int result = factorial(5); // 编译期直接计算为 120,无运行时开销
-
const
无法强制函数在编译期求值,即使函数逻辑是纯的。const int result = factorial(5); // 可能运行时计算(除非编译器优化)
两种方法实现编译期计算代码(factorial实现):
constexpr int factorial(int x) { // 改为 constexprreturn x > 0 ? x * factorial(x - 1) : 1;
}int main() {static_assert(factorial(1) == 1, "no compile-time optimize"); // 编译通过return 0;
}
template<int N>
struct Factorial {static const int value = N * Factorial<N - 1>::value;
};template<>
struct Factorial<0> {static const int value = 1;
};int main() {static_assert(Factorial<1>::value == 1, "no compile-time optimize"); // 编译通过return 0;
}
3. 适用范围更广
-
constexpr
可以修饰变量、函数、构造函数和对象,支持编译期复杂逻辑。constexpr std::array<int, 3> values = {1, 2, 3}; // 编译期初始化容器
-
const
仅修饰变量或函数返回值,无法用于构造函数或对象初始化。
4. 类型安全与错误检查
-
constexpr
编译器会严格检查初始化表达式是否为编译期常量表达式,提前暴露逻辑错误。constexpr int x = some_runtime_function(); // 编译错误:非编译期表达式
-
const
允许运行时初始化,错误可能延迟到运行时才发现。const int x = some_runtime_function(); // 合法,但可能运行时失败
5. 现代 C++ 的演进方向
-
constexpr
是 C++11 后引入的现代特性,支持编译期计算、元编程和常量传播,符合 C++ 向编译期计算发展的趋势(如 C++14、C++17 扩展的constexpr
功能)。// C++17 允许 constexpr lambda constexpr auto square = [](int x) { return x * x; };
-
const
是传统 C/C++ 的关键字,功能相对单一。
何时使用 const
?
尽管推荐优先使用 constexpr
,但 const
仍有其适用场景:
- 运行时初始化:
若变量值需在运行时确定且无需编译期已知。const int buffer_size = get_config_value(); // 运行时初始化
- 修饰函数参数或返回值:
表示函数内部不修改参数或返回值不可修改。void print(const std::string& s); // 参数不可修改
- 旧代码兼容:
维护 C++11 之前的代码库时,constexpr
不可用。
constexpr应用场景
在业务开发中,constexpr
的编译期计算能显著提升代码性能、增强安全性和可维护性。
1. 配置常量与全局参数
场景:将业务中固定的配置参数(如超时时间、缓存大小、魔法数字)定义为编译期常量,避免重复计算和运行时开销。
示例:
// 业务配置
constexpr int MAX_RETRY_TIMES = 3; // 最大重试次数
constexpr double DEFAULT_TIMEOUT = 5.0; // 默认超时时间(秒)
constexpr size_t CACHE_LINE_SIZE = 64; // CPU 缓存行大小// 编译期断言确保配置合法性
static_assert(MAX_RETRY_TIMES > 0, "Retry times must be positive");
static_assert(DEFAULT_TIMEOUT < 10.0, "Timeout too long");
2. 数据验证与业务规则检查
场景:在编译期验证业务规则(如状态码范围、ID有效性),提前发现错误。
示例:
// 业务状态码定义
enum class StatusCode {Success = 0,InvalidInput = 1,Timeout = 2,// ...
};// 编译期检查状态码是否在合法范围内
constexpr bool isValidStatusCode(int code) {return code >= static_cast<int>(StatusCode::Success) && code <= static_cast<int>(StatusCode::Timeout);
}static_assert(isValidStatusCode(1), "Invalid status code");
3. 数学计算与业务逻辑优化
场景:将频繁使用的数学计算结果(如哈希、加密参数)在编译期预先计算,减少运行时开销。
示例:
// 编译期计算 CRC32 校验和的查表(常用于网络协议)
constexpr auto generateCRCTable() {std::array<uint32_t, 256> table{};for (uint32_t i = 0; i < 256; ++i) {uint32_t crc = i;for (int j = 0; j < 8; ++j) {crc = (crc >> 1) ^ ((crc & 1) ? 0xEDB88320 : 0);}table[i] = crc;}return table;
}constexpr auto CRC_TABLE = generateCRCTable(); // 编译期生成查表
4. 模板元编程与类型选择
场景:根据业务需求在编译期选择类型或策略(如日志级别控制、序列化格式)。
示例:
// 根据日志级别编译期选择输出方式
enum class LogLevel { Debug, Info, Error };template <LogLevel Level>
constexpr auto getLogger() {if constexpr (Level == LogLevel::Debug) {return DebugLogger(); // 调试日志器(编译期优化掉生产环境不用的代码)} else {return DefaultLogger();// 默认日志器}
}// 使用
auto logger = getLogger<LogLevel::Debug>();
5. 容器与数据结构的编译期初始化
场景:初始化业务中固定的查找表、映射关系(如国家码转换、错误码描述)。
示例:
// 编译期初始化错误码到描述的映射表
constexpr std::array<std::pair<int, const char*>, 3> ERROR_MAP = {{{400, "Bad Request"},{404, "Not Found"},{500, "Internal Error"}
}};// 编译期查找错误描述
constexpr const char* getErrorDesc(int code) {for (const auto& entry : ERROR_MAP) {if (entry.first == code) return entry.second;}return "Unknown Error";
}static_assert(getErrorDesc(404) == "Not Found", "Mapping error");
6. 业务算法优化
场景:将业务中的固定算法(如哈希、加密)的关键参数在编译期展开。
示例:
// 编译期计算字符串哈希(用于类型ID生成)
constexpr uint32_t constexprHash(const char* str, int len) {return (len == 0) ? 0 : (constexprHash(str, len-1) * 31 + str[len-1]);
}constexpr uint32_t UserTypeHash = constexprHash("User", 4); // 编译期计算哈希值// 用于类型分发
template <uint32_t Hash>
void processType() { /*...*/ }processType<UserTypeHash>(); // 直接使用编译期哈希值
7. 业务逻辑的条件编译
场景:根据编译期条件启用或禁用业务功能(如灰度发布、AB测试开关)。
示例:
// 定义编译期功能开关
constexpr bool FEATURE_NEW_PAYMENT = true;
constexpr bool FEATURE_LEGACY_UI = false;void processPayment() {if constexpr (FEATURE_NEW_PAYMENT) {// 新支付逻辑(旧代码在编译期被移除)} else {// 旧支付逻辑}
}
8. 业务协议解析优化
场景:在编译期计算协议头部的固定字段偏移或校验值。
示例:
// 定义协议头部结构
struct ProtocolHeader {uint32_t magic;uint16_t version;uint16_t checksum;// ...
};// 编译期计算协议魔数
constexpr uint32_t PROTOCOL_MAGIC = constexprHash("MY_PROTO", 8);// 编译期断言协议头部布局
static_assert(offsetof(ProtocolHeader, version) == 4, "Protocol layout error");
汇总上述场景:
场景 | 收益 | 示例 |
---|---|---|
配置常量 | 消除运行时计算,增强可维护性 | 超时时间、缓存大小 |
数据验证 | 提前暴露业务逻辑错误 | 状态码检查、ID有效性 |
数学计算 | 减少运行时开销 | CRC查表、哈希预计算 |
模板元编程 | 编译期策略选择,优化代码分支 | 日志器选择、序列化策略 |
容器初始化 | 固定数据快速访问 | 错误码映射表、国家码转换 |
协议解析 | 确保协议一致性,避免运行时错误 | 头部偏移检查、魔数校验 |
核心优势:
- 零运行时开销:计算在编译期完成,节省 CPU 和内存。
- 增强安全性:通过
static_assert
在编译期捕捉业务逻辑错误。 - 代码自文档化:明确标注编译期已知的常量或规则。
- 优化代码体积:移除未使用的分支(配合
if constexpr
)。
注意事项:
- 避免过度使用导致编译时间增加。
- C++11 的
constexpr
功能有限,建议使用 C++14 或更高版本。
总结
特性 | constexpr | const |
---|---|---|
初始化时机 | 必须编译期初始化 | 允许运行时初始化 |
适用场景 | 编译期常量、模板参数、元编程 | 运行时常量、接口约束 |
函数支持 | 可修饰编译期函数 | 仅修饰变量或函数返回值 |
优化潜力 | 编译期计算,零运行时开销 | 依赖编译器优化 |
错误检查 | 严格编译期检查 | 运行时可能失败 |
推荐策略:
- 需要编译期确定的常量或逻辑 →
constexpr
- 仅需运行时不可修改的变量 →
const
- 现代 C++ 代码优先使用
constexpr
,除非明确需要运行时初始化。
相关文章:
【C/C++】C++中constexpr与const的深度对比
文章目录 C中constexpr与const的深度对比1. 编译期确定性2. 更严格的优化保证3. 适用范围更广4. 类型安全与错误检查5. 现代 C 的演进方向何时使用 const?constexpr应用场景1. 配置常量与全局参数2. 数据验证与业务规则检查3. 数学计算与业务逻辑优化4. 模板元编程与…...
劳特巴赫trace32负载率测试
按照下图步骤点击即可...
牛客OJ在线编程常见输入输出练习--Java版
目录 一、链接 二、题目 一、链接 牛客输入输出链接:牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 二、题目 1.只有输出 public class Main {public static void main(String[] args) {System.out.println("H…...
STM32 | FreeRTOS 递归信号量
递归信号量 一、概述 互斥量的使用比较单一,因为它是信号量的一种,并且它是以锁的形式存在。在初始化的时候,互斥量处于开锁的状态,而被任务持有的时候则立刻转为闭锁的状态。 递归类型的互斥量可以被拥有者重复获取。拥有互斥量…...
STM32 | 软件定时器
01 一、概述 软件定时器是用程序模拟出来的定时器,可以由一个硬件定时器模拟出成千上万个软件定时器,这样程序在需要使用较多定时器的时候就不会受限于硬件资源的不足,这是软件定时器的一个优点,即数量不受限制。但由于软件定…...
2025年EB SCI2区TOP,多策略改进黑翅鸢算法MBKA+空调系统RC参数辨识与负载聚合分析,深度解析+性能实测
目录 1.摘要2.黑翅鸢优化算法BKA原理3.改进策略4.结果展示5.参考文献6.代码获取7.读者交流 1.摘要 随着空调负载在电力系统中所占比例的不断上升,其作为需求响应资源的潜力日益凸显。然而,由于建筑环境和用户行为的变化,空调负载具有异质性和…...
互联网大厂Java面试:从Spring到微服务的全面探讨
文章简述 本文模拟了一个互联网大厂Java求职者的面试场景,涵盖了Java核心语言与平台、构建工具、Web框架、微服务与云原生等多个技术栈。通过面试问答的形式,展示了在真实业务场景下如何应用这些技术点,帮助初学者理解和学习。 场景介绍 在…...
Python爬虫之路(14)--playwright浏览器自动化
playwright 前言 你有没有在用 Selenium 抓网页的时候,体验过那种「明明点了按钮,它却装死不动」的痛苦?或者那种「刚加载完页面,它又刷新了」的抓狂?别担心,你不是一个人——那是 Selenium 在和现代前…...
Elasticsearch Fetch阶段面试题
Elasticsearch Fetch阶段面试题 🚀 目录 基础原理性能优化错误排查场景设计底层机制总结基础原理 🔍 面试题1:基础原理 题目: 请描述Elasticsearch分布式搜索中Query阶段和Fetch阶段的工作流程,为什么需要将搜索过程拆分为这两个阶段? 👉 点击查看答案 查询流程…...
RAGFlow Arbitrary Account Takeover Vulnerability
文章目录 RAGFlowVulnerability Description[1]Vulnerability Steps[2]Vulnerability Steps[3]Vulnerability Steps RAGFlow RAGFlow is an open-source RAG (Retrieval-Augmented Generation) engine developed by Infiniflow, focused on deep document understanding and d…...
框架之下再看HTTP请求对接后端method
在当今的软件开发领域,各类框架涌现,极大地提升了开发效率。以 Java 开发为例,Spring 框架不断演进,Spring Boot 更是简化到只需引入 Maven 包,添加诸如SpringBootApplication、RestController等注解,就能轻…...
机器学习中的过拟合及示例
文章目录 机器学习中的过拟合及示例1. 过拟合的定义2. 过拟合的常见例子例1:图像分类中的过拟合例2:回归任务中的过拟合例3:自然语言处理(NLP)中的过拟合 3. Python代码示例:过拟合的直观演示示例1…...
机器学习-人与机器生数据的区分模型测试 -数据筛选
内容继续机器学习-人与机器生数据的区分模型测试 使用随机森林的弱学习树来筛选相对稳定的特征数据 # 随机森林筛选特征 X data.drop([city, target], axis1) # 去除修改前的城市名称列和目标变量列 y data[target] X_train, X_test, y_train, y_test train_test_split(X…...
第9讲、深入理解Scaled Dot-Product Attention
Scaled Dot-Product Attention是Transformer架构的核心组件,也是现代深度学习中最重要的注意力机制之一。本文将从原理、实现和应用三个方面深入剖析这一机制。 1. 基本原理 Scaled Dot-Product Attention的本质是一种加权求和机制,通过计算查询(Query…...
无监督学习在医疗AI领域的前沿:多模态整合、疾病亚型发现与异常检测
引言 人工智能技术在医疗领域的应用正经历着从辅助决策向深度赋能的转变。无监督学习作为人工智能的核心范式之一,因其无需大量标注数据、能够自动发现数据内在规律的特性,在医疗AI领域展现出独特优势。尤其在2025年,无监督学习技术在医疗AI应用中呈现出多模态整合、疾病亚…...
PostgreSQL内幕剖析——结构与架构
大家好,这里是失踪人口bang__bang_,从今天开始持续更新PostgreSQL内幕相关内容,让我们一起了解学习吧✊! 目录 1️⃣ DB集群、数据库、表 🍙 数据库集群的逻辑结构 🍙 数据库集群的物理结构 &am…...
架构师论文《论模型驱动架构软件开发方法及其应用》
摘要 在当前的软件开发领域,模型驱动架构(MDA)作为一种重要的开发方法,强调通过抽象化模型指导系统设计与实现,能够有效提升开发效率并降低复杂性。本文结合笔者参与的某医疗信息管理系统的开发实践,探讨MD…...
当硅基存在成为人性延伸的注脚:论情感科技重构社会联结的可能性
在东京大学机器人实验室的档案室里,保存着一份泛黄的二战时期设计图——1943年日本陆军省秘密研发的“慰安妇替代品”草图。这个诞生于战争阴霾的金属躯体,与2025年上海进博会上展出的MetaBox AI伴侣形成时空对话:当人类将情感需求投射于硅基…...
最小二乘法拟合直线,用线性回归法、梯度下降法实现
参考笔记: 最小二乘法拟合直线,多个方法实现-CSDN博客 一文让你彻底搞懂最小二乘法(超详细推导)-CSDN博客 目录 1.问题引入 2.线性回归法 2.1 模型假设 2.2 定义误差函数 2.3 求偏导并解方程 2.4 案例实例 2.4.1 手工计算…...
机器学习 day04
文章目录 前言一、线性回归的基本概念二、损失函数三、最小二乘法 前言 通过今天的学习,我掌握了机器学习中的线性回归的相关基本概念,包括损失函数的概念,最小二乘法的理论与算法实现。 一、线性回归的基本概念 要理解什么是线性回归&…...
数据分析_Python
1 分析内容 1.1 数据的整体概述 提供数据集的基本信息,包括数据量、时间跨度、地理范围和主要字段. import pandas as pd# 创建示例数据 data {姓名: [张三, 李四, 王五, 赵六, 钱七, 孙八, 周九, 吴十],年龄: [25, 30, 35, 40, 45, 50, 55, 60],性别: [男, 男, 女, 女, 男,…...
精益数据分析(63/126):移情阶段的深度潜入——从用户生活到产品渗透的全链路解析
精益数据分析(63/126):移情阶段的深度潜入——从用户生活到产品渗透的全链路解析 在创业的移情阶段,成功的关键不仅在于发现用户的表面需求,更在于深入潜入用户的日常生活,理解其行为背后的真实动机与场景…...
【MySQL】第五弹——表的CRUD进阶(三)聚合查询(上)
文章目录 🌅聚合函数🌊1.COUNT();统计所有行🌊2. SUM(列名); 求和🌊3. AVG() 求平均🌊4. MAX(),MIIN() 🌅分组查询🌊GROUP BY 子句🌊HAVING 🌅联合查询🌊联合…...
英语学习5.16
recede 【动词】 👉 关键词:后退、减弱、退去 ✅ 释义: 后退,远离 指物体逐渐远离、移开或变得不明显,常用于描述水面、声音、军队、头发线等的“退却”或“后移”。 如:The floodwaters receded.&#x…...
创建react工程并集成tailwindcss
1. 创建工程 npm create vite admin --template react 2.集成tailwndcss 打开官网跟着操作一下就行。 Installing Tailwind CSS with Vite - Tailwind CSS...
2025 年九江市第二十三届中职学校技能大赛 (网络安全)赛项竞赛样题
2025 年九江市第二十三届中职学校技能大赛 (网络安全)赛项竞赛样题 (二)A 模块基础设施设置/安全加固(200 分)A-1 任务一登录安全加固(Windows,Linux)A-2 任务二 Nginx 安全策略&…...
STM32IIC实战-OLED模板
STM32IIC实战-OLED模板 一,SSD1306 控制芯片1, 主要特性2,I2C 通信协议3, 显示原理4, 控制流程5, 开发思路 二,HAL I2C API 解析I2C 相关 API1,2,3,4…...
BMVC2023 | 多样化高层特征以提升对抗迁移性
Diversifying the High-level Features for better Adversarial Transferability 摘要-Abstract引言-Introduction相关工作-Related Work方法-Methodology实验-Experiments结论-Conclusion 论文链接 GitHub链接 本文 “Diversifying the High-level Features for better Adve…...
C++ deque双端队列、deque对象创建、deque赋值操作
在deque中,front()是头部元素,back()指的是尾部元素。begin()是指向头部的迭代器,end()是指向尾部的下一个元素的迭代器。 push_front 头部进行插入 pop_front 尾部进行删除 push_back 尾部进行插入 pop_back 尾部进行删除 deque如果同时…...
【论文阅读】人脸修复(face restoration ) 不同先验代表算法整理2
文章目录 一、前述二、不同的先验及代表性论文2.1 几何先验(Geometric Prior)2.2 生成式先验(Generative Prior)2.3 codebook先验(Vector Quantized Codebook Prior)2.4 扩散先验 (Diffusion Pr…...
2025年渗透测试面试题总结-百度面经(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 百度面经 百度安全工程师面试深度复盘与优化指南 一、项目经验反思与优化策略 二、技术问题深度解析 …...
muduo库TcpConnection模块详解——C++
muduo库中的TcpConnection模块详解 TcpConnection是muduo库中处理TCP连接的核心模块,负责管理单个TCP连接的生命周期、数据读写、状态转换以及事件回调。每个TCP连接对应一个TcpConnection对象,其设计体现了高性能、线程安全和灵活回调的特点。 一、核心…...
aksharetools:大模型智能体框架agno可直接获取A股金融数据
原创内容第889篇,专注智能量化投资、个人成长与财富自由。 今天说说金融智能体开发。 智能体开发需要一个多agent框架。这样的框架,现在太多了,langchain, langgraph,autogen,crewai等等,还有各种低代码平…...
使用Maven部署WebLogic应用
使用Maven部署WebLogic应用 在Maven项目中部署应用到WebLogic服务器可以通过以下几种方式实现: 1. 使用WebLogic Maven插件 (官方推荐) Oracle提供了官方的WebLogic Maven插件,这是最直接的部署方式。 基本配置 <build><plugins><pl…...
[Java][Leetcode simple] 13. 罗马数字转整数
一、自己想的 只有提到的六种情况是-,其他都是 public int romanToInt1(String s) {int res 0;int n s.length();Map<Character, Integer> map new HashMap<>();map.put(I, 1);map.put(V, 5);map.put(X, 10);map.put(L, 50);map.put(C, 100);map.pu…...
【论文阅读】针对BEV感知的攻击
Understanding the Robustness of 3D Object Detection with Bird’s-Eye-View Representations in Autonomous Driving 这篇文章是发表在CVPR上的一篇文章,针对基于BEV的目标检测算法进行了两类可靠性分析,即恶劣自然条件以及敌对攻击。同时也提出了一…...
Ansible模块——设置软件仓库和安装软件包
设置软件仓库 ansible.builtin.rpm_key ansible.builtin.rpm_key 用于在 Fedora/RHEL 上导入或移除 GPG 公钥。 参数名 类型 默认值 说明 fingerprintstrnull 指定公钥的完整指纹(long-form)。在导入前会比对公钥是否匹配此指纹,增强安全…...
基于CentOS7制作OpenSSL 1.1的RPM包
背景:CentOS7 已经不再维护了,有时候需要升级某些组件,网上却没有相关的资源了。尤其是制作OpenSSH 9.6 的RPM包,就会要求OpenSSL为1.1的版本。基于此,还是自己制作吧,以下是踩坑过程。 1、官网提供的源码包…...
【Element UI】表单及其验证规则详细
Form表单 Form表单验证1. 使用方法2. rule参数3. validator回调函数异步服务器验证 Form表单验证 Form组件提供了表单验证的功能,需要通过rules属性传入约定的验证规则,并将Form-Item的prop属性设置为需校验的字段名 1. 使用方法 结构: &…...
使用 Python 打造一个强大的文件系统结构创建器
本文将深入分析一个基于 wxPython 的文件系统结构创建器程序,展示如何通过 CustomTreeCtrl 组件实现文件夹和文件的可视化管理,并提供添加、删除、导入、清空以及创建文件系统结构的强大功能。这个程序不仅适合开发者快速构建文件系统原型,还…...
面试真题 - 高并发场景下Nginx如何优化
Nginx是一款高性能的Web服务器和反向代理服务器,以其轻量级、高并发处理能力和稳定性闻名。在面对高并发场景时,合理的配置与优化策略至关重要,以确保服务的稳定性和响应速度。 以下是针对Nginx进行高并发优化的一些关键配置和策略ÿ…...
学习笔记:黑马程序员JavaWeb开发教程(2025.4.6)
12.4 登录校验-JWT令牌-介绍 JWT(JSON Web Token) 简洁是指JWT是一个简单字符串,自包含指的是JWT令牌,看似是一个随机字符串,但是可以根据需要,自定义存储内容 Header是JSON数据格式,原始JSO…...
机器学习——逻辑回归
一、逻辑回归概念点 逻辑回归(Logistic Regression)是一种广泛使用的统计分析方法和机器学习算法,主要用于处理二分类问题(即因变量为二元类别,如0和1、是和否等)。尽管名字中有“回归”二字,但…...
服务间的“握手”:OpenFeign声明式调用与客户端负载均衡
现在,假设我们有一个新的order-service,它在创建订单时需要获取用户信息。 如果order-service直接硬编码user-service的IP和端口进行调用,会面临以下问题: 缺乏弹性: 如果user-service实例的IP或端口发生变化(在云环境…...
蓝桥杯11届国B 答疑
题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序,同学们要依次进入老师办公室答疑。 一位同学答疑的过程如下: 首先进入办公室,编号为 i 的同学需要 si 毫秒的时间。然后同学问问题老…...
【单机版OCR】清华TH-OCR v9.0免费版
今天向大家介绍一款非常好用的单机版OCR图文识别软件,它不仅功能多,识别能力强,而且还是免费使用的。OCR软件为什么要使用单机版,懂得都懂,因为如果使用在线识别的OCR软件,用户需要将文档上传互联网服务器的…...
蓝牙耳机什么牌子好?倍思值得冲不?
最近总被问“蓝牙耳机什么牌子好”,作为踩过无数坑的资深耳机党,必须安利刚入手的倍思M2s Pro主动降噪蓝牙耳机!降噪、音质、颜值全都在线,性价比直接拉满。 -52dB降噪,通勤摸鱼神器 第一次开降噪就被惊到!…...
Java卡与SSE技术融合实现企业级安全实时通讯
简介 在数字化转型浪潮中,安全与实时数据传输已成为金融、物联网等高安全性领域的核心需求。本文将深入剖析东信和平的Java卡权限分级控制技术与浪潮云基于SSE的大模型数据推送技术,探索如何将这两项创新技术进行融合,构建企业级安全实时通讯系统。通过从零到一的开发步骤,…...
使用Spring Boot和Spring Security构建安全的RESTful API
使用Spring Boot和Spring Security构建安全的RESTful API 引言 在现代Web开发中,安全性是构建应用程序时不可忽视的重要方面。本文将介绍如何使用Spring Boot和Spring Security框架构建一个安全的RESTful API,并结合JWT(JSON Web Token&…...
Win11下轻松搭建wiki.js,Docker.desktop部署指南(mysql+elasticsearch+kibana+wiki.js)
Docker.desktop部署wiki.js指南 前言环境和要求介绍提前准备 1. elasticsearch1.1 部署容器1.2 参数说明1.3 验证容器是否部署成功 2. kibana2.1 部署容器2.2 验证是否部署成功2.3 安装IK分词器 3. MySql3.1 部署容器3.2 增加数据库和wiki.js所需要的账号 4. wiki.js4.1 部署容…...