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

C++23新特性解析:[[assume]]属性

1. 引言

在C++的发展历程中,性能优化一直是一个核心主题。C++23引入的[[assume]]属性为开发者提供了一个强大的工具,允许我们直接向编译器传达程序的不变量(invariant),从而实现更好的代码优化。

1.1 为什么需要assume?

在C++23之前,主要编译器都提供了自己的内置假设机制:

  • MSVC和ICC使用__assume(expr)
  • Clang使用__builtin_assume(expr)
  • GCC没有直接支持,但可以通过以下方式模拟:
if (expr) {} else { __builtin_unreachable(); }

这导致了几个问题:

  1. 代码可移植性差
  2. 不同编译器的语义略有不同
  3. 需要使用条件编译来处理不同平台

1.2 标准化的好处

C++23的[[assume]]属性解决了这些问题:

  1. 提供统一的标准语法
  2. 定义明确的语义
  3. 保证跨平台一致性
  4. 向后兼容性好

2. 基本语法和核心概念

2.1 语法规则

[[assume(expression)]];  // expression必须是可转换为bool的条件表达式

重要限制:

  1. 表达式必须是条件表达式(conditional-expression)
  2. 不允许使用顶层逗号表达式
  3. 不允许直接使用赋值表达式

示例:

// 正确用法
[[assume(x > 0)]];
[[assume(x != nullptr)]];
[[assume(size % 4 == 0)]];// 错误用法
[[assume(x = 1)]];          // 错误:不允许赋值表达式
[[assume(x, y > 0)]];       // 错误:不允许顶层逗号表达式
[[assume((x = 1, y > 0))]]; // 正确:额外的括号使其成为单个表达式

2.2 核心特性:表达式不求值

[[assume]]的一个关键特性是其中的表达式不会被实际执行。这与assert有本质区别:

int main() {int counter = 0;// assert会实际执行增加操作assert(++counter > 0);  // counter变为1// assume不会执行表达式[[assume(++counter > 0)]];  // counter仍然是1std::cout << "Counter: " << counter << std::endl;  // 输出1return 0;
}

这个特性的重要性:

  1. 不会产生副作用
  2. 不会影响程序的运行时行为
  3. 纯粹用于编译器优化

2.3 优化示例:整数除法

让我们看一个经典的优化示例:

// 未优化版本
int divide_by_32_unoptimized(int x) {return x / 32;
}// 使用assume优化
int divide_by_32_optimized(int x) {[[assume(x >= 0)]];  // 假设x非负return x / 32;
}

这段代码在不同情况下生成的汇编代码(使用x64 MSVC):

未优化版本:

; 需要处理负数情况
mov eax, edi      ; 移动参数到eax
sar eax, 31      ; 算术右移31位(符号扩展)
shr eax, 27      ; 逻辑右移27位
add eax, edi     ; 加上原始值
sar eax, 5       ; 算术右移5位(除以32)
ret

优化版本:

; 知道是非负数,直接右移
mov eax, edi      ; 移动参数到eax
shr eax, 5       ; 逻辑右移5位(除以32)
ret

优化效果分析:

  1. 指令数从5条减少到2条
  2. 不需要处理符号位
  3. 使用更简单的逻辑右移替代算术右移

2.4 未定义行为

如果assume中的表达式在运行时实际为false,程序行为是未定义的:

void example(int* ptr) {[[assume(ptr != nullptr)]];*ptr = 42;  // 如果ptr实际为nullptr,是未定义行为
}int main() {int* p = nullptr;example(p);  // 危险!程序可能崩溃或产生其他未定义行为
}

这意味着:

  1. 必须确保假设在所有情况下都成立
  2. 假设应该描述真实的程序不变量
  3. 错误的假设可能导致程序崩溃或其他未预期的行为

3. 编译期行为

3.1 ODR-use

assume中的表达式会触发ODR-use(One Definition Rule使用),这意味着:

template<typename T>
void process(T value) {[[assume(std::is_integral_v<T>)]];  // 会实例化is_integral// ...
}// 这会触发模板实例化
process(42);  // T = int

影响:

  1. 可能触发模板实例化
  2. 可能捕获lambda表达式
  3. 可能影响类的ABI

3.2 constexpr环境

在constexpr环境中的行为:

constexpr int get_value() {return 42;
}constexpr int example() {[[assume(get_value() == 42)]];  // 是否允许取决于实现return 0;
}// 非constexpr函数
int runtime_value() {return 42;
}constexpr int example2() {[[assume(runtime_value() == 42)]];  // 允许,assume会被忽略return 0;
}

特点:

  1. 假设不满足时,是否报错由实现定义
  2. 无法在编译期求值的表达式会被忽略
  3. 满足的假设在编译期没有效果

4. 高级用法

4.1 循环优化

assume在循环优化中特别有用,可以帮助编译器生成更高效的代码:

void process_array(float* data, size_t size) {// 告诉编译器数组大小和对齐信息[[assume(size > 0)]];[[assume(size % 16 == 0)]];  // 16字节对齐[[assume(reinterpret_cast<uintptr_t>(data) % 16 == 0)]];for(size_t i = 0; i < size; ++i) {// 编译器可以生成更高效的SIMD指令data[i] = std::sqrt(data[i]);}
}

这些假设帮助编译器:

  1. 消除边界检查
  2. 启用向量化
  3. 使用SIMD指令
  4. 展开循环

4.2 分支优化

assume可以帮助消除不必要的分支:

int complex_calculation(int value) {[[assume(value > 0 && value < 100)]];if(value < 0) {return -1;  // 编译器知道这永远不会执行}if(value >= 100) {return 100;  // 编译器知道这永远不会执行}return value * 2;  // 编译器可以直接生成这个计算
}

优化效果:

  1. 消除不可能的分支
  2. 减少指令数量
  3. 改善分支预测

4.3 函数调用优化

assume可以帮助优化函数调用:

class String {char* data_;size_t size_;size_t capacity_;public:void append(const char* str) {[[assume(str != nullptr)]];  // 避免空指针检查[[assume(size_ < capacity_)]];  // 避免重新分配检查while(*str) {data_[size_++] = *str++;}}
};

优化点:

  1. 消除参数检查
  2. 内联优化
  3. 减少错误处理代码

5. 实际应用场景

5.1 音频处理

在音频处理中,数据经常有特定的约束:

class AudioProcessor {
public:// 处理音频样本,假设:// 1. 样本数是128的倍数(常见的音频缓冲区大小)// 2. 样本值在[-1,1]范围内// 3. 没有NaN或无穷大void process_samples(float* samples, size_t count) {[[assume(count > 0)]];[[assume(count % 128 == 0)]];for(size_t i = 0; i < count; ++i) {[[assume(std::isfinite(samples[i]))];[[assume(samples[i] >= -1.0f && samples[i] <= 1.0f)]];// 应用音频效果samples[i] = apply_effect(samples[i]);}}private:float apply_effect(float sample) {// 知道sample在[-1,1]范围内,可以优化计算return sample * 0.5f + 0.5f;  // 编译器可以使用更高效的指令}
};

优化效果:

  1. 更好的向量化
  2. 消除范围检查
  3. 使用特殊的SIMD指令
  4. 减少分支指令

5.2 图形处理

在图形处理中,assume可以帮助优化像素操作:

struct Color {uint8_t r, g, b, a;
};class ImageProcessor {
public:// 处理图像数据,假设:// 1. 宽度是4的倍数(适合SIMD)// 2. 图像数据是对齐的// 3. 不会越界void apply_filter(Color* pixels, size_t width, size_t height) {[[assume(width > 0 && height > 0)]];[[assume(width % 4 == 0)]];[[assume(reinterpret_cast<uintptr_t>(pixels) % 16 == 0)]];for(size_t y = 0; y < height; ++y) {for(size_t x = 0; x < width; x += 4) {// 处理4个像素一组process_pixel_group(pixels + y * width + x);}}}private:void process_pixel_group(Color* group) {// 编译器可以使用SIMD指令处理4个像素// ...}
};

优化机会:

  1. SIMD指令使用
  2. 内存访问模式优化
  3. 循环展开
  4. 边界检查消除

5.3 数学计算

在数学计算中,assume可以帮助编译器使用特殊指令:

class MathOptimizer {
public:// 计算平方根,假设:// 1. 输入非负// 2. 不是NaN或无穷大static double fast_sqrt(double x) {[[assume(x >= 0.0)]];[[assume(std::isfinite(x))];return std::sqrt(x);  // 编译器可以使用特殊的sqrt指令}// 计算倒数,假设:// 1. 输入不为零// 2. 输入在合理范围内static float fast_reciprocal(float x) {[[assume(x != 0.0f)]];[[assume(std::abs(x) >= 1e-6f)]];[[assume(std::abs(x) <= 1e6f)]];return 1.0f / x;  // 可能使用特殊的倒数指令}
};

优化可能:

  1. 使用特殊的硬件指令
  2. 消除边界检查
  3. 避免异常处理代码

6. 最佳实践和注意事项

6.1 安全使用指南

// 好的实践
void good_practice(int* ptr, size_t size) {// 1. 假设清晰且可验证[[assume(ptr != nullptr)]];[[assume(size > 0)]];// 2. 假设表达了真实的程序不变量[[assume(size <= 1000)]];  // 如果确实有这个限制// 3. 假设帮助优化[[assume(size % 4 == 0)]];  // 有助于向量化
}// 不好的实践
void bad_practice(int value) {// 1. 不要使用可能改变的值[[assume(value == 42)]];  // 除非确实保证value总是42// 2. 不要使用副作用[[assume(func() == true)]];  // 函数调用可能有副作用// 3. 不要使用过于复杂的表达式[[assume(complex_calculation() && another_check())]];
}

6.2 性能优化建议

  1. 选择性使用
void selective_usage(int* data, size_t size) {// 只在性能关键路径使用assumeif(size > 1000) {  // 大数据集的关键路径[[assume(size % 16 == 0)]];process_large_dataset(data, size);} else {// 小数据集不需要特别优化process_small_dataset(data, size);}
}
  1. 配合其他优化
void combined_optimization(float* data, size_t size) {// 结合多个优化技术[[assume(size % 16 == 0)]];#pragma unroll(4)  // 与循环展开配合for(size_t i = 0; i < size; i += 16) {// SIMD优化的代码process_chunk(data + i);}
}

6.3 调试和维护

class DebugHelper {
public:static void verify_assumptions(int* ptr, size_t size) {#ifdef DEBUG// 在调试模式下验证假设assert(ptr != nullptr);assert(size > 0);assert(size % 16 == 0);#endif// 生产环境使用assume[[assume(ptr != nullptr)]];[[assume(size > 0)]];[[assume(size % 16 == 0)]];}
};

7. 总结

C++23的[[assume]]属性是一个强大的优化工具,但需要谨慎使用:

  1. 优点

    • 提供标准化的优化提示机制
    • 可以显著提高性能
    • 帮助编译器生成更好的代码
  2. 注意事项

    • 只在确保条件成立时使用
    • 错误的假设会导致未定义行为
    • 主要用于性能关键的代码路径
  3. 最佳实践

    • 仔细验证所有假设
    • 配合assert在调试模式下验证
    • 保持假设简单且可验证
    • 记录所有假设的依赖条件
  4. 使用建议

    • 在性能关键的代码中使用
    • 结合其他优化技术
    • 保持代码可维护性
    • 定期审查假设的有效性

相关文章:

C++23新特性解析:[[assume]]属性

1. 引言 在C的发展历程中&#xff0c;性能优化一直是一个核心主题。C23引入的[[assume]]属性为开发者提供了一个强大的工具&#xff0c;允许我们直接向编译器传达程序的不变量&#xff08;invariant&#xff09;&#xff0c;从而实现更好的代码优化。 1.1 为什么需要assume&a…...

航电系统电子罗盘的作用

一、基本功能与原理 电子罗盘&#xff0c;又称数字罗盘&#xff0c;是利用地磁场来定北极的一种方法。它结合了电子技术和晶体技术&#xff0c;通过灵敏的线圈、控制电路及读出系统来探测特定磁场&#xff0c;从而确定方向。电子罗盘可以测量磁场强度、方向、大小及旋转角度&am…...

从 $PGDATA 到文件组:深入解析 PostgreSQL 与 SQL Server 的存储策略

在数据库领域,数据存储和管理的效率与可靠性是决定系统性能、可扩展性和易于管理的关键因素。PostgreSQL 和 SQL Server 在数据存储方面采取了略有不同的方式。 PostgreSQL 中一个数据库管理员经常遇到的关键概念是 $PGDATA 文件夹。在这里,我们将探讨 $PGDATA 文件夹是什么…...

IDEA无法打开插件市场的解决

1.版本 我的IDEA版本号为2020.1.4 大家可以从IDEA的help->about进行版本号的查看 2.解决 我们直接到jetbrains官网搜索你想要下载的插件 直接下载即可自动导入...

PPO算法基础(一)

PPO近端策略优化算法 我们今天还是主要来理解PPO算法的数学原理。PPO是一种策略梯度方法&#xff0c;简单的策略梯度对每个样本&#xff08;或者一组样本&#xff09;进行一次梯度更新&#xff0c;对单个样本执行多个梯度步骤会导致一些问题&#xff0c;因为梯度偏差太大&…...

Docker部署seata 最详细版

1.docker安装 我采用的系统是ubuntu 22 1.1 更新系统 首先&#xff0c;打开终端并更新你的系统包&#xff1a; sudo apt update sudo apt upgrade -y 1.2. 安装必要的依赖 安装一些必要的工具&#xff0c;用于允许 apt 使用 HTTPS&#xff1a; sudo apt install apt-t…...

Debian 12 安装配置 fail2ban 保护 SSH 访问

背景介绍 双十一的时候薅羊毛租了台腾讯云的虚机, 是真便宜, 只是没想到才跑了一个月, 系统里面就收集到了巨多的 SSH 恶意登录失败记录. 只能说, 互联网真的是太不安全了. 之前有用过 fail2ban 在 CentOS 7 上面做过防护, 不过那已经是好久好久之前的故事了, 好多方法已经不…...

C++之“流”-第5课.三军联动:流 +操作符+函数重载

如何针对特定函数类型重载流输出操作符&#xff1f;这样做有什么用处&#xff1f;C语言中&#xff0c;“流”、“操作符”、“函数重载” 这三大军团如何配合作战&#xff1f; 前言 C中&#xff0c;“流” 的日常运用&#xff0c;最基本的就是在你的代码里使用 << 和 &g…...

Mysql高级部分总结(二)

MySQL的内部日志 binlog记载的是update/delete/insert这样的SQL语句,而redo log记载的是物理修改的内容(xxxx页修改了xxx)。 binlog无论MySQL用什么引擎,都会有,而redo log是MySQL的InnoDB引擎所产生的。 redo log事务开始的时候,就开始记录每次的变更信息,而binlog是在…...

Linux服务器端自动挂载存储设备(U盘、移动硬盘)

前言 Linux服务器挂载存储设备需要使用mount,因为服务器的存储通常是固定的,很少存在频繁的插拔USB存储设备的现象 ,使用Linux系统本身是没有较为简单的自动挂载存储设备的方法的。 涉及知识点 udev udev可以监测USB设备的插入、拔出事件,并且Linux系统支持通过/etc/ude…...

动态规划<四> 回文串问题(含对应LeetcodeOJ题)

目录 引例 其余经典OJ题 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 引例 OJ 传送门Leetcode<647>回文子串 画图分析&#xff1a; 使用动态规划解决 原理&#xff1a;能够将所有子串是否是回文的信息保存在dp表中 在使用暴力方法枚举出所有子串&#xff0c;是…...

计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

多边形内角问题@三角形的基本性质@平面镶嵌问题

文章目录 abstract符号说明多边形正多边形正 n n n边形正多边形中心角 多边形内角和外角多边形内角和定理证明证法一证法二证法三 多边形外角 多边形的对角线平面镶嵌&#x1f47a;全等多边形平面镶嵌拓展正多边形镶嵌平面用一种正多边形镶嵌用两种正多边形镶嵌 使用三种正多边…...

【vue】圆环呼吸灯闪烁效果(模拟扭蛋机出口处灯光)

效果图先发&#xff1a; 页面部分&#xff1a; <div ref"round" class"round"><div class"light" ref"light"/><div class"box"></div></div>js部分(控制圆环生成&#xff09;; setRound…...

Ftp目录整个下载

最近有个需求是要下载ftp接近十个T的数据&#xff0c;在调研过多个工具后发现还是lftp的mirror最省事 mirror参数 Mirror specified source directory to local target directory. If target directory ends with a slash, the source base name is appended to target direc…...

实践KDTS-WEB从mysql迁移到kingbasev9

数据库国产化替代数据迁移是一个复杂且关键的过程。这涉及到将原有数据库中的数据准确、完整地迁移到新的国产数据库中&#xff0c;同时确保数据的完整性和一致性。人大金仓提供了强大的数据库迁移工具&#xff08;KDTS&#xff09;对同构、异构数据库数据迁移&#xff1b; 数…...

【贪吃蛇小游戏 - JavaIDEA】基于Java实现的贪吃蛇小游戏导入IDEA教程

有问题请留言或私信 步骤 下载项目源码&#xff1a;项目源码 解压项目源码到本地 打开IDEA 左上角&#xff1a;文件 → 新建 → 来自现有源代码的项目 找到解压在本地的项目源代码文件&#xff0c;点击确定 选择“从现有项目创建项目”。点击“下一步” 点击下一步&a…...

STM32CUBEMX+STM32H743ZIT6+IAP+UART在线升级初始化和代码解析

1、STM32H7带的ITCM&#xff0c;DTCM&#xff0c;AXI SRAM&#xff0c;SRAM1&#xff0c;SRAM2&#xff0c;SRAM3&#xff0c;SRAM4和备份SRAM五块。 其中&#xff0c; ①TCM区包括ITCM和DTCM&#xff0c;这两个是直连CPU的。 速率与CPU一致&#xff0c;最高能到480MHz。 DTCM地…...

vue-axios+springboot实现文件流下载

前端vue代码&#xff1a; <template><div class"app-container documentation-container"><div><el-button type"primary" click"downloadFile(test.xlsx)">下载test.xlsx</el-button></div></div> …...

vue预览和下载 pdf、ppt、word、excel文档,文件类型为链接或者base64格式或者文件流,

** 方法1&#xff1a;word、xls、ppt、pdf 这些文件&#xff0c; 如果预览的文件是链接可以直接打开&#xff0c;可用微软官方的预览地址 ** <iframe width"100%" :src"textVisibleURl " id"myFramePPT" style"border: none;backgroun…...

GIS 文件格式 及 常规应用总结

文章目录 GIS 中常见的文件格式 以及 再次打开注意事项资源网站应用地图瓦片数据地形数据倾斜模型 QGS 应用矢量数据格式栅格数据格式数据库格式更改图层样式更改图层范围导出为不同分辨率图片导出矢量文件直接保存图层通过打印布局导出使用插件导出 tiff 图片前端处理方式 GIS…...

《Pytorch框架CV开发-从入门到实战》

目录 1.环境部署2.自动梯度计算张量 tensor3.线性回归4.逻辑回归6.人工神经网络的基本概念6.1 感知器6.2 激活函数6.3多层感知器6.4 反向传播算法——前向传播6.5 反向传播算法——反向传播6.6 反向传播算法——训练方法7.Pytorch基础数据集8.手写数字识别人工神经网络训练8.1 …...

element-ui的el-select多选同时获取label与value值

直接上代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><!-- 引入 Element UI 的 CSS --><link rel"stylesheet" href"https://unpkg.com/element-ui/lib/theme-chalk/index.css"><…...

跨站请求伪造之基本介绍

一.基本概念 1.定义 跨站请求伪造&#xff08;Cross - Site Request Forgery&#xff0c;缩写为 CSRF&#xff09;漏洞是一种网络安全漏洞。它是指攻击者通过诱导用户访问一个恶意网站&#xff0c;利用用户在被信任网站&#xff08;如银行网站、社交网站等&#xff09;的登录状…...

干部大数据分析系统如何助力构建选人用人的逻辑框架

在当今信息化快速发展的时代&#xff0c;干部大数据分析系统作为一种创新的管理工具&#xff0c;正在逐步改变传统的选人用人方式。这一系统融合了大数据、人工智能等现代信息技术&#xff0c;为组织部门提供了一个强大的辅助决策工具&#xff0c;有助于构建更加科学、准确和公…...

今天最新早上好问候语精选大全,每天问候,相互牵挂,彼此祝福

1、朋友相伴&#xff0c;友谊真诚永不变&#xff01;彼此扶持绿树荫&#xff0c;共度快乐雨后天&#xff01;一同分享的表情&#xff0c;愿我们友情长存&#xff0c;一生相伴永相连&#xff01; 2、人生几十年&#xff0c;苦累伴酸甜&#xff0c;风华不再茂&#xff0c;雄心非当…...

Android开发环境搭建和编译系统

1 工具使用 1.1 将dos格式的文件转换为unix格式文件 直接执行 dos2unix file 例如&#xff1a; dos2unix InotifyMon/AndroidManifest.xml 1.2 Linux Shell FTP使用 ftp <IP addr> 输入ID和password prompt off // 下载文件到本地 mget * 1.3 Linux sed 1.3.1 Linux命令之…...

autMan奥特曼机器人-autMan的PHP环境

直装版请自行安装php环境。 docker版本预置了php环境&#xff0c;如下图&#xff1a; 如果使用插件"test php"测试环境时&#xff0c;实时日志有报错如下&#xff1a; 可进入终端&#xff0c;输入两条命令 apk add curl apk add php-curl...

路径规划之启发式算法之二十:麻雀搜索算法(Sparrow Search Algorithm,SSA)

麻雀搜索算法(Sparrow Search Algorithm,SSA)是一种受麻雀觅食和反捕食行为启发的新型的群智能优化算法,它模拟了麻雀种群的觅食行为和反捕食行为的生物学群体特征。该算法由薛建凯在2020年首次提出,旨在解决全局优化问题,具有求解精度高、效率高等特点。 一、算法原理 S…...

Vue+element 回车查询页面刷新

问题描述&#xff1a; form 表单出查询条件需要实现 input 输入完成后键盘回车查询&#xff1a;keyup.enter“handleQuery”&#xff0c;如果 form 里只有一个input&#xff0c;回车没有触发事件&#xff0c;而是刷新页面&#xff0c;放两个input就没问题 问题原因&#xff1…...

为何页面搜索应避免左模糊和全模糊查询???

前言 在构建高效且可扩展的Web应用程序时&#xff0c;数据库查询的性能是影响用户体验的关键因素之一。特别是对于涉及大量数据的页面搜索功能&#xff0c;选择正确的查询方式不仅可以提升应用的速度&#xff0c;还能显著改善用户交互体验。 B-Tree索引与最左前缀匹配特性 1…...

源码分析之Openlayers中ZoomSlider滑块缩放控件

概述 ZoomSlider滑块缩放控件就是Zoom缩放控件的异形体&#xff0c;通过滑块的拖动或者点击滑槽&#xff0c;实现地图的缩放&#xff1b;另外其他方式控制地图缩放时&#xff0c;也会引起滑块在滑槽中的位置改变&#xff1b;即ZoomSlider滑块缩放控件会监听地图的缩放级别&…...

Cherno C++学习笔记 P46 箭头运算符

这一篇文章我们讲一下箭头运算符的使用。在之前的一些场景下&#xff0c;我们已经使用到了箭头运算符&#xff0c;这次我们可以更深入的聊一下箭头运算符应该如何使用&#xff0c;以及我们如何实现自己的箭头指针。 我们还是以一个最简单的Entity类举例&#xff1a; class En…...

项目转换微服务架构

文章目录 1.sun-dependencies引入SpringCloud的版本2. 创建sun-cloud-home微服务1.创建maven项目2.目录概览3.pom.xml4.application.yml5.application-prod.yml6.HomeApplicaion.java7.HomeController.java8.测试访问9.打包测试 3.创建sun-cloud-sku微服务1.磁盘将这个sun-clou…...

WebRTC搭建与应用(五)-Coturn踩坑记

WebRTC搭建与应用(五)-Coturn踩坑记 近期由于项目需要在研究前端WebGL渲染转为云渲染&#xff0c;借此机会对WebRTC等有了初步了解&#xff0c;在此记录一下&#xff0c;以防遗忘。 第五章 WebRTC搭建与应用(五)-Coturn踩坑记 文章目录 WebRTC搭建与应用(五)-Coturn踩坑记前…...

Uniapp 手机基座调试App 打包成Apk文件,并上传到应用商店

1.Uniapp手机基座调试App。 1.1 以下是我另一篇文章 讲解 uniapp连接手机基座调试App、 Hbuildx使用SUB运行到手机基座测试_hbuilder基座-CSDN博客 2.打包本地的uniapp项目为apk文件。 打包的方式有很多种&#xff0c;我们可以选择本地打包和远程云端打包两种方式。 我们在打包…...

【AI日记】24.12.24 kaggle 比赛 2-12

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加&#xff1a;kaggle 比赛 Regression with an Insurance Dataset时间&#xff1a;3 小时 读书 书名&#xff1a;我们能做什么 : 胡适与中国青年最真诚的分享时间&#xff1a;2 小时 律己 工作时…...

教师如何打造专属私密成绩查询系统?

期末的校园&#xff0c;被一种特殊的氛围所笼罩。老师们如同辛勤的工匠&#xff0c;精心打磨着每一个教学环节。复习阶段&#xff0c;他们在知识的宝库中精挑细选&#xff0c;把一学期的重点内容一一梳理&#xff0c;为学生们打造出系统的复习框架。课堂上&#xff0c;他们激情…...

【linux】NFS实验

NFS服务 NFS是Network File System&#xff08;网络文件系统&#xff09;的缩写。它是一种用于在计算机网络中共享文件和目录的协议。NFS允许计算机上的用户访问和操作远程计算机上的文件&#xff0c;就像访问本地文件一样。它使用客户端-服务端模型&#xff0c;其中客户端机器…...

ubuntu22.04安装PaddleX3

PaddleOCR 安装过程可以参考PaddleX本地安装教程 我的电脑环境配置&#xff1a; ubuntu22.04 cuda11.8&#xff08;之前安装的是12.4没有匹配的paddle-gpu;这里改成11.8&#xff09; 一、安装基础环境 1、 conda create -n ppx1 python3.10 2、 conda activate ppx1 3、…...

无标记动作捕捉系统如何赋能体育运动分析,推动体育科学发展?

随着技术的不断发展与社会的需要&#xff0c;健康、科学运动成为了大众关注的一个热词。在韩国首尔的中央大学&#xff0c;其生物运动临床康复实验室和运动训练中心就致力于通过生物力学分析来研究与运动相关的伤害&#xff0c;并通过定制科学的训练计划来帮助运动员改进他们的…...

JavaScript 标准内置对象——Array

1、构造函数 2、静态方法 // 从可迭代或类数组对象创建一个新的浅拷贝的数组实例 // arrayLike 想要转换成数组的类数组或可迭代对象 Array.from(arrayLike, mapFn, thisArg) Array.fromAsync(arrayLike, mapFn, thisArg) // 异步Array.isArray(value) // 判断传递的值是否是一…...

Python超能力:高级技巧让你的代码飞起来

文章一览 前言一、with1.1 基本用法1.2 示例自定义上下文管理器 二、条件表达式三、列表式推导式与 zip 结合 四、map() 函数&#xff08;内置函数&#xff09;map用于数据清洗1. 数据清洗&#xff1a;字母大小写规范2. filter() 函数 五、匿名函数 lambda5.1 lambda的参数&…...

move生态

move生态 Move 生态主要围绕着 Move 编程语言及其相关的区块链平台构建&#xff0c;这些平台旨在提供更高的安全性、可扩展性和开发者友好性。以下是关于 Move 生态的一些关键点&#xff1a; 1. 核心区块链平台 Aptos&#xff1a;Aptos 是一个 Layer 1 区块链&#xff0c;专注…...

使用插件时要注意

在使用插件时&#xff0c;需要注意一些关键事项&#xff0c;确保插件能够稳定、安全地工作&#xff0c;并且不会给系统带来风险或负担。以下是使用插件时需要注意的几个重要方面&#xff1a; 1. 插件来源与信任度 官方渠道与可靠来源&#xff1a;总是选择来自官方网站、知名平…...

JVM对象分配内存如何保证线程安全?

大家好&#xff0c;我是锋哥。今天分享关于【JVM对象分配内存如何保证线程安全&#xff1f;】面试题。希望对大家有帮助&#xff1b; JVM对象分配内存如何保证线程安全&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在JVM中&#xff0c;对象的内存分配…...

ApacheStruts2 目录遍历与文件上传漏洞复现(CVE-2024-53677,S2-067)(附脚本)

0x01 产品描述: Apache Struts 2 是一个用于JAVA的MVC框架,它用于快速开发web应用。它的设计目标是使得开发者能够更容易的处理web应用的展现层,数据层,和业务层。0x02 漏洞描述: CVE-2024-53677 漏洞的根本原因是 Struts 框架中不安全的文件上传处理机制。攻击者利用 CVE…...

Scala字符串连接方法—mkString—用法详解

Scala字符串连接方法—mkString—用法详解 在 Scala 中&#xff0c;mkString 是集合&#xff08;如数组、列表、字符串等&#xff09;的一种方法&#xff0c;用于将集合中的元素连接成一个字符串。 def mkString(sep: String): Stringdef mkString(start: String, sep: String…...

[实战]Spring Boot启动卡在Root WebApplicationContext initialization completed in

Spring Boot启动 打印Root WebApplicationContext: initialization completed in…这行日志完成后需要等很长时间才能真正启动完成。 分析一下发现是连接某个机器的MySQL就会出现这种情况。使用客户端软件连接MySQL时也很慢&#xff0c;但连接完成后执行MySQL各种语句非常看。…...

什么样的LabVIEW控制算自动控制?

自动控制是指系统通过预先设计的算法和逻辑&#xff0c;在无人工干预的情况下对被控对象的状态进行实时监测、决策和调整&#xff0c;达到预期目标的过程。LabVIEW作为一种图形化编程工具&#xff0c;非常适合开发自动控制系统。那么&#xff0c;什么样的LabVIEW控制算作“自动…...