constexpr 关键字的意义(入门)
author: hjjdebug
date: 2025年 05月 15日 星期四 16:03:33 CST
description: constexpr 关键字的意义(入门)
constexpr 是c++11 引入的一个关键字, 代表了一种属性.
文章目录
- 1. constexpr 修饰的变量, 在编译期间就可以得到其数值.
- 2. constexpr 修饰的函数, 可以在编译期间被调用.
- 3. 研究代码
- 4. constexpr 修饰的变量, 可以调用constexpr 修饰的函数来赋值
- 5. constexpr 修饰的函数怎样调试呢?
- 6. constexpr 修饰的函数, 在release版本下是怎样工作的?
- 7. constexpr 还可以修饰构造函数,成员函数.
- 7.1 在常量表达式函数中你不能调用printf 函数
- 7.2 在运行函数中调用constexpr 对象
- 8 小结:
1. constexpr 修饰的变量, 在编译期间就可以得到其数值.
例如: constexpr int arr_ce[5]={1,2,3,4,5};
这里编译器gcc 会给arr_ce 变量加上 constexpr 属性.
这里你会说,我不加constexpr 不是一样声明变量并赋初值啊.
int arr_ce[5]={1,2,3,4,5};
是的, 这样也声明并初始化了变量arr_ce[5], 但它们没有constexpr属性,
那constexpr 属性有什么用? 且看后面慢慢道来.
2. constexpr 修饰的函数, 可以在编译期间被调用.
例如: 费伯纳兹函数F, 我们加上constexpr 修饰词.
constexpr int F(int n) {
return n == 0 ? 0 :
(n == 1 ? 1: F(n-1)+F(n-2));
}
有了这个属性和没有这个属性有什么差别呢?
答案来了,有这个属性的构成一个群! 构成一个在编译时就可以执行的群.
下面举例说明.
3. 研究代码
$ cat main.cpp
#include <stdio.h>
//constexpr 修饰的函数,可以在编译期计算.
constexpr int F(int n) { return n == 0 ? 0 : (n == 1 ? 1: F(n-1)+F(n-2));
}
//constexpr 修饰的变量,可以调用constexpr 修饰的函数来赋值
//直接得到常量数据
constexpr int arr_ce[5]={F(0),F(1),F(2),F(3),F(4)
};int arr_n[5];
struct Point {
//在常量表达式函数中你不能调用printf 函数constexpr Point(int x, int y) : x(x), y(y) {/*printf("Point construct\n");*/}int x, y;
};constexpr Point p1(1, 2); // ✅ 合法:在编译期间就可以构建对象,对象地址在全局数据区并构建完成
int main() {printf("%d %d %d %d %d\n",arr_ce[0],arr_ce[1],arr_ce[2],arr_ce[3],arr_ce[4]);
//constexpr 修饰的函数,也可以在运行期工作. 如下:
//在debug版本下, 你可以单步调试程序.
//在release版本下, 函数名称及函数结构被优化掉了.
//我以为它会优秀的把计算结果直接填进去,
//实际上也不是 ,还是有计算的过程.
//它把计算代码穿插到了调用代码中.unsigned long int i;for(i=0;i<5;i++){ //注意这里,release 版直接把函数代码穿插进来arr_n[i]=F(i);}constexpr Point p2(3, 4); // 放到这里用constexpr 修饰就有点不伦不类,也可以这样做.printf("p1:%p,p2:%p\n",&p1,&p2);return 0;
}//constexpr 还可以修饰构造函数,成员函数. 意味着这些函数在编译期间就可以调用.
4. constexpr 修饰的变量, 可以调用constexpr 修饰的函数来赋值
//直接得到常量数据
constexpr int arr_ce[5]={
F(0),F(1),F(2),F(3),F(4)
};
如果没有constexpr 来修饰F(), 这样的书写方式是不允许的.
error: call to non-‘constexpr’ function ‘int F(int)’
我们看一下arr_ce[5]的数值
其对应的反汇编代码.
printf(“%d %d %d %d %d\n”,arr_ce[0],arr_ce[1],arr_ce[2],arr_ce[3],arr_ce[4]);
0x0000555555555155 <+12>: mov $0x3,%edi
0x000055555555515a <+17>: mov $0x2,%esi
0x000055555555515f <+22>: mov $0x1,%ecx
0x0000555555555164 <+27>: mov $0x1,%edx
0x0000555555555169 <+32>: mov $0x0,%eax
0x000055555555516e <+37>: mov %edi,%r9d
0x0000555555555171 <+40>: mov %esi,%r8d
0x0000555555555174 <+43>: mov %eax,%esi
0x0000555555555176 <+45>: lea 0xea7(%rip),%rdi # 0x555555556024
0x000055555555517d <+52>: mov $0x0,%eax
0x0000555555555182 <+57>: callq 0x555555555050 printf@plt
arr_ce[] 的5个数据是 0 1 1 2 3
我们看到printf 的前6个参数
rdi -> 字符串地址
rsi -> 0
rdx -> 1
rcx -> 1
r8 -> 2
r9 -> 3
说明打印时直接传递了数据.
忘了,原来直接看数组的内容才更简洁.
(gdb) p arr_ce
$1 = {0, 1, 1, 2, 3}
5. constexpr 修饰的函数怎样调试呢?
constexpr 函数也是我们自己写的, 那么多代码,运行出错了怎么办?
constexpr 修饰的函数,也可以在运行期工作. 例如我们在main函数中调用它,
把它的数值付给一个非constexpr 的数据, debug 版本下可以跟入函数来调试.
不过constexpr 修饰的函数,按说不应该在运行期调用, 否则你不如去掉constexpr 修饰.
6. constexpr 修饰的函数, 在release版本下是怎样工作的?
这应该属于进阶分析了. 因为constexpr 修饰的函数,不建议在运行期调用,
但我调用了,会是什么情况呢?更何况谁会保证不会穿插调用呢.
我试了一下,调用没问题, 但奇怪的是release 版本下怎么看不到 被调用的函数名呢?
是的,你用nm 工具确实查不到constexpr 修饰的函数, 我用反汇编分析了一下,发现gcc把
constexpr 修饰的函数直接优化穿插到调用代码中来了,gcc很神奇, 看下边汇编分析
int arr[5];
int main() {unsigned long int i;for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++){ //注意这里, release 版直接把代码穿插进来,没有对应的F()代码.arr[i]=F(i);}return 0;
}0000000000001040 <main>:1040: f3 0f 1e fa endbr64 1044: 41 55 push %r131046: 31 c0 xor %eax,%eax1048: 41 54 push %r12104a: 45 31 e4 xor %r12d,%r12d104d: 55 push %rbp104e: 53 push %rbx104f: 31 db xor %ebx,%ebx1051: 48 83 ec 08 sub $0x8,%rsp //调整堆栈,开辟局部空间1055: 4c 8d 2d c4 2f 00 00 lea 0x2fc4(%rip),%r13 # 4020 <arr>105c: 0f 1f 40 00 nopl 0x0(%rax)1060: 44 01 e0 add %r12d,%eax // F(n-1) + F(n-2)1063: 41 89 44 9d 00 mov %eax,0x0(%r13,%rbx,4) //保留ebx 到 arr[i]1068: 48 83 c3 01 add $0x1,%rbx106c: 48 83 fb 05 cmp $0x5,%rbx //i==51070: 74 2e je 10a0 <main+0x60> //退出循环1072: 89 dd mov %ebx,%ebp1074: 45 31 e4 xor %r12d,%r12d1077: b8 01 00 00 00 mov $0x1,%eax107c: 48 83 fb 01 cmp $0x1,%rbx // i==1?1080: 74 de je 1060 <main+0x20> //进行处理1082: 8d 7d ff lea -0x1(%rbp),%edi1085: e8 16 01 00 00 callq 11a0 <_Z7Fabnacii> //递归恢复堆栈108a: 41 01 c4 add %eax,%r12d //r12d 为F(n-1)108d: 89 e8 mov %ebp,%eax //ebp 是保留的i108f: 83 e8 02 sub $0x2,%eax // i==2 ?1092: 74 cc je 1060 <main+0x20> //进行处理1094: bd 02 00 00 00 mov $0x2,%ebp1099: 83 f8 01 cmp $0x1,%eax // i==3 ?时109c: 75 e4 jne 1082 <main+0x42> // i==其它时的处理109e: eb c0 jmp 1060 <main+0x20> //进行处理10a0: 48 83 c4 08 add $0x8,%rsp //恢复堆栈10a4: 31 c0 xor %eax,%eax //返回010a6: 5b pop %rbx //恢复保留的寄存器10a7: 5d pop %rbp10a8: 41 5c pop %r1210aa: 41 5d pop %r1310ac: c3 retq 10ad: 0f 1f 00 nopl (%rax)
7. constexpr 还可以修饰构造函数,成员函数.
意味着这些函数在编译期间就可以调用.
7.1 在常量表达式函数中你不能调用printf 函数
struct Point {
constexpr Point(int x, int y) : x(x), y(y) {printf(“Point construct\n”);}
int x, y;
};
实例化结构变量时会有错误. 说printf 不是常量表达式.
error: ‘printf(((const char*)“Point construct\012”))’ is not a constant expression
常量表达式是在编译时就能确定的表达式. printf 是运行时的调用函数,其执行由调用参数及系统环境来确定
所以常量表达式函数中不能调用 printf 函数.
7.2 在运行函数中调用constexpr 对象
// 把constexpr 函数放到main() 下执行也是可以的,尽管觉得有点不伦不类.
35 constexpr Point p2(3, 4);
0x00000000004011d2 <+124>: movl $0x3,-0x10(%rbp)
0x00000000004011d9 <+131>: movl $0x4,-0xc(%rbp)
此是gcc 把代码编译成 对象初始化参数直接存入对象的成员地址. 很简明, 没有所谓的显示调用构造函数的过程.
与release版调用constexpr 函数优化穿插代码类似.
8 小结:
算入门介绍吧. 介绍了constexpr 修饰全局变量(当然局部变量也可以),修饰函数,修饰成员函数,修饰构造函数的
使用场景,并给出了实例和实现分析. 原来其好处是gcc 在生成运行代码时,先自己一通运算把能确定下来的东西先确定下来.
后面还有针对模板的使用下期介绍.
相关文章:
constexpr 关键字的意义(入门)
author: hjjdebug date: 2025年 05月 15日 星期四 16:03:33 CST description: constexpr 关键字的意义(入门) constexpr 是c11 引入的一个关键字, 代表了一种属性. 文章目录 1. constexpr 修饰的变量, 在编译期间就可以得到其数值.2. constexpr 修饰的函数, 可以在编译期间被调…...
aptitude 深度教程:从基础到生产实践
目录 一、aptitude 基础:核心概念与环境准备 1.1 aptitude 是什么? 1.2 安装与环境配置 二、aptitude 核心操作:从命令行到交互式界面 2.1 命令行基础操作 2.2 交互式界面(TUI)入门 三、高级功能:依赖管理与版本控制 3.1 依赖冲突解决实战 3.2 版本锁定与降级 3…...
嵌入式开发学习日志(数据结构--双链表)Day21
一、双链表 1.定义 双向链表是在单链表的每个结点中,再设置一个指向其钱去节点的指针域。 2、声明文件 3、创建表头 4、头插 5、 遍历 6、尾插、 7、指定插 8、查找 9、修改 10.、删除 11、逆序 12、销毁链表 13、main.c 三、扩展:工程管理工具&#…...
抢购Python代码示例与技术解析
引言:抢购系统的技术挑战 在当今电子商务高度发达的时代,抢购活动已成为各大电商平台吸引用户的重要手段。然而,高并发、低延迟的抢购场景对系统设计提出了严峻挑战。本文将提供一个完整的Python抢购代码示例,并深入分析其技术实…...
undefined reference to CPUAllocatorSingleton::instance
它发生的原因是你声明了 CPUAllocatorSingleton 类中的 instance 变量,但没有提供它的定义。 这个错误是链接器无法找到 CPUAllocatorSingleton::instance 的定义。它发生的原因是你声明了 CPUAllocatorSingleton 类中的 instance 变量,但没有提供它的定…...
【c语言】动态内存分配
文章标题 一、为什么要进行动态内存管理二、malloc和free2.1. malloc2.2. free2.3. 举例 三、calloc和realloc3.1. calloc3.2. realloc 四、常见的动态内存错误4.1. 对NULL指针的解引用操作4.2. 对动态开辟空间的越界访问4.3. 对非动态开辟内存使用free释放4.4. 使用free释放⼀…...
深入理解JavaScript中的闭包:原理、应用与常见问题
引言 闭包(Closure)是JavaScript中一个既强大又容易让人困惑的概念。理解闭包对于成为一名优秀的JavaScript开发者至关重要。本文将深入探讨闭包的工作原理、实际应用场景以及常见问题,帮助你彻底掌握这一重要概念。 什么是闭包? 闭包是指那些能够访问…...
IPLOOK | 2025 MVNOs 世界大会:从Wi-Fi通话到卫星覆盖
2025 MVNOs 世界大会于5月12日至14日在奥地利维也纳举行,汇聚了来自50多个国家的550余位行业领袖,共同探讨移动虚拟网络运营商(MVNO)领域的变革趋势。本届大会聚焦数字化转型、技术创新与战略合作,其中IPLOOK凭借其创新…...
为什么elasticsearch配置文件JVM配置31G最佳
Elasticsearch的JVM堆内存配置为32GB被视为最佳实践,主要基于以下综合技术原理和性能优化考量: 1. JVM指针压缩机制优化内存效率 当堆内存≤32GB时,JVM启用对象指针压缩(Compressed Ordinary Object Pointers, COOP&#…...
单片机开发软件
目录 纯编码 vscode Ardunio Keil 1. 集成化开发环境(IDE) 2. 多架构芯片支持 3. 高效的代码生成与优化 4. 强大的调试与仿真功能 5. 丰富的库函数与生态系统 6. 教育与企业级适用性 典型应用场景 半编码半图形化 STM32CUBEIED 1. 图形化配置…...
Java随机生成邀请码 (包含字母大小写+数字)
前言: 目前我们生成的是6位包含数字和大小写字母的随机邀请码, 并且代码中已经有了处理冲突的机制确保了邀请码的唯一性如(①生成随机邀请码后会检查数据库中是否已存在②如果存在冲突,会尝试最多10次重新生成③如果多次尝试仍失败,会使用"U"用户ID派生的…...
mybatis-plus配置逻辑删除
在实体类中标记软删除字段使用注解 TableLogic 标记该字段为软删除字段 import com.baomidou.mybatisplus.annotation.*;public class YourEntity {// ...其他字段TableLogicprivate Integer isDeleted;// getter/setter }yml配置 # 逻辑已删除值 logicDeleteValue: 2 # 逻辑…...
第二十五天打卡
常见报错类型 try-except-else-finally 语句 首先执行try语句,若正确直接执行else语句 若try语句发生错误,则判断错误类型,执行错误类型对应的except语句,不执行else语句 finally语句无条件执行,多用于资源保存&…...
JESD204 ip核使用与例程分析(一)
JESD204 ip核使用与例程分析(一) JESD204理解JESD204 与JESD204 PHY成对使用原因JESD204B IP核JESD204B IP核特点JESD204B IP核配置第一页第二页第三页第四页JESD204 PHY IP核配置第一页第二页JESD204理解 JESD204B是一种针对ADC、DAC设计的传输接口协议。此协议包含四层, …...
Synchronized详解及高频面试问答
目录 JVM简述 Synchronized详解及面试高频问答 而synchronized是什么,可以解决什么问题? synchronized怎么使用? 锁升级升级了什么? 为什么要这样做锁升级? 锁升级的过程是怎样的?为什么会有偏向锁&…...
【LLIE专题】基于码本先验与生成式归一化流的低光照图像增强新方法
GLARE: Low Light Image Enhancement via Generative Latent Feature based Codebook Retrieval(2024,ECCV) 专题介绍一、研究背景二、GLARE方法阶段一:正常光照代码本学习(Normal-Light Codebook Learning)…...
26考研 | 王道 | 计算机组成原理 | 一、计算机系统概述
26考研 | 王道 | 计算机组成原理 | 一、计算机系统概述 文章目录 26考研 | 王道 | 计算机组成原理 | 一、计算机系统概述1.1 计算机的发展1.2 计算机硬件和软件1.2.1 计算机硬件的基本组成1.2.2 各个硬件的工作原理1.2.3 计算机软件1.2.4 计算机系统的层次结构1.2.5 计算机系统…...
Linux云计算训练营笔记day08(MySQL数据库)
Linux云计算训练营笔记day08(MySQL数据库) 目录 Linux云计算训练营笔记day08(MySQL数据库)数据准备修改更新update删除delete数据类型1.整数类型2.浮点数类型(小数)3.字符类型4.日期5.枚举: 表头的值必须在列举的值里选择拷贝表复…...
从基础到实习项目:C++后端开发学习指南
在当今技术快速迭代的背景下,后端开发作为软件工程的核心支柱持续发挥着关键作用。C凭借其卓越的性能表现和系统级控制能力,依然是构建高性能后端服务的首选语言之一。本文将系统性地解析现代C后端开发的核心技术体系,包括从语言特性精要到架…...
jedis+redis pipeline诡异的链接损坏、数据读取异常问题解决
文章目录 问题现象栈溢出(不断的重连)读取超时未知响应尝试读取损坏的链接读取到的数据和自己要读的无关,导致空指针、类型转换错误,数据读取错乱 问题写法问题分析修复注意点 问题现象 栈溢出(不断的重连)…...
十、HQL:排序、联合与 CTE 高级查询
作者:IvanCodes 日期:2025年5月15日 专栏:Hive教程 Apache Hive 作为大数据领域主流的数据仓库解决方案,其查询语言 HQL (Hive Query Language) 是数据分析师和工程师日常工作的核心。除了基础的 SELECT-FROM-WHERE,HQ…...
数据结构—排序(斐波那契数列,冒泡,选择,插入,快速,归并,图,广度优先算法)
目录 一 斐波那契数列(递归算法) 定义 原理 二 冒泡排序 定义 排序思路 函数原型 参数详解: 算法分析: 1. 使用函数库的qsort函数 2. 自定义冒泡排序 三 选择排序 定义 排序思路 四 插入排序 定义 排序思路 五 快速…...
NetSuite CSV导入Item Fulfillment的功能测试
上一篇我们说过如何通过CSV导入更新IF上的Department/Class信息,这篇是来测试一下如果SO在Pending Fulfillment的状态下通过CSV导入IF,这个新版本的一个功能,刚好将测试的过程与结果与大家分享~ 准备文件 External ID是外部ID; …...
网络原理 | 网络基础概念复习
目录 网络中的重要概念 IP地址 端口号 协议 五元组 协议分层 OSI七层网络模型 TCP/IP 五层(四层)模型 网络设备所在的分层 封装和分用 网络中的重要概念 IP地址 IP地址主要用于标识网络主机、其他网络设备的网络地址。在网络数据传输中&#…...
Vsan数据恢复——Vsan上虚拟机不可用,虚拟机组件信息破坏的数据恢复
Vsan数据恢复环境: 一台采用VsSAN分布式文件系统的存储设备由于未知原因关机重启。管理员发现上层的虚拟机不可用,存储内的数据丢失。 Vsan数据恢复过程: 1、将故障存储设备断电,将存储内的硬盘编号后取出。硬件工程师检测后没有发…...
V837s-LAN8720A网口phy芯片调试
目录 前言 一、LAN8720A 芯片概述 二、硬件连接 三、设备树配置 四、内核配置 五、网口调试 总结 前言 在嵌入式系统开发中,网络连接是至关重要的一部分。v837s开发板搭载了LAN8720A系列的网口PHY芯片,用于实现以太网连接。在开发过程中,对于网口的稳定性和性能的调试至…...
C++(12):using声明
目录 一、定义 二、核心用法示例 示例 1:单独引入 std::string 和 std::coun 示例 2:在局部作用域中使用 using 声明 三、对比 using namespace std(不推荐) 四、关键注意事项 1. 名称冲突问题 2. 作用域规则 3. 头文件中的陷阱 五、最佳实践总结 六、完整安全示…...
Xinference 命令大全:从模型部署到管理
Xinference 是一个高性能、分布式的模型推理框架,支持多种大语言模型(LLM)、嵌入模型(Embedding)和图像生成模型。本文将详细介绍 Xinference 的常用命令,涵盖模型启动、管理、监控及 API 调用,帮助你快速掌握其核心功能。 1. 安装与启动 Xinference 1.1 安装 Xinferen…...
如何在线免费压缩PDF文档?
PDF文件太大,通常是因为内部嵌入字体和图片。怎么才能将文件大小减减肥呢,主要有降低图片清晰度和去除相关字体两个方向来实现文档效果。接下来介绍三个免费压缩PDF实用工具。 (一)iLoveOFD在线转换工具 iLoveOFD在线转换工具&a…...
在Rocky Linux 9.5上部署MongoDB 8.0.9:从安装到认证的完整指南
mongodb 的部署 #安装依赖 yum -y install libcurl openssl #安装mongodb yum -y install https://repo.mongodb.org/yum/redhat/9/mongodb-org/8.0/x86_64/RPMS/mongodb-org-server-8.0.9-1.el9.x86_64.rpm #启动服务 systemctl start mongod.service && system…...
Unix Bourne Shell
本文来源 : 腾讯元宝 Unix Bourne Shell(简称sh)是Unix系统中最经典的命令行解释器(shell),由Stephen Bourne于1977年在贝尔实验室开发,并成为后续众多shell(如bash、ksh等ÿ…...
如何在 AWS 上构建支持 AVIF 的前端图片优化方案
一、为什么使用 AVIF 图片格式? 优势点 说明 高压缩率 在相似质量下,AVIF 文件比 JPEG/PNG/WebP 更小,能有效节省带宽和存储空间。 更高画质 即使在低码率下也能保持清晰细节,减少压缩带来的马赛克或模糊问题。 支持透明度 …...
Linux系统进行环境开发环境配置
一. 使用fishros(鱼香肉丝)配置开发环境 对于初学者来说,最难的关卡莫非是开发环境的的搭建,特别是在Ubuntu系统上ROS系统安装时后出现的各种报错以及失败,本篇博客讲述了ROS系统的一键安装过程,适用于18.04及以后的Ubuntu系统版本…...
前端npm的核心作用与使用详解
一、npm是什么? npm(Node Package Manager) 是 Node.js 的默认包管理工具,也是全球最大的开源代码库生态系统。虽然它最初是为 Node.js 后端服务设计的,但如今在前端开发中已成为不可或缺的基础设施。通过npm,开发者可以轻松安装、管理和共享代码模块。 特性: 依赖管理…...
软考软件评测师——软件工程之系统维护
一、系统质量属性 可维护性 衡量软件系统适应修改的难易程度,包括修复缺陷、扩展功能或调整规模的效率。计算公式为:系统可用时间占比 1/(1平均修复时间),其中平均修复时间(MTTR)指排除故障所需的平均耗时。 可靠性 vs 可用性 可靠性&…...
CSRF攻击 + 观测iframe加载时间利用时间响应差异侧信道攻击 -- reelfreaks DefCamp 2024
参考: https://0x90r00t.com/2024/09/30/3708/ 题目信息 有些事情最好还是保持低调。当然,除非你是个真正的怪胎。 注意:该网站通过HTTPS提供服务 标志格式:DCTF{}题目实现了一个类似视频网站的东西 在其提供的数据库中…...
火山RTC 8 SDK集成进项目中
一、SDK 集成预备工作 1、SDK下载 https://www.volcengine.com/docs/6348/75707 2、解压后 3、放在自己项目中的位置 1)、include 2)、lib 3)、dll 暂时,只需要VolcEngineRTC.dll RTCFFmpeg.dll openh264-4.dll, 放在intLive2…...
spring boot Controller 和 RestController 的区别
spring boot Controller 和 RestController 的区别 5.3.1常用注解 Spring MVC控制器中常使用的注解有如下几种。 Controller Controller 标记在类上。使用Controller 标记的类表示是Spring MVC的Controller对象。分发处理器将会扫描使用了该注解的类,并检测其中的…...
mavgenerate 在 win11 下环境搭建注意问题
开发随笔 mavgenerate 是mavlink配套的协议生成工具,mavgenerate 在 win11 下环境搭建注意问题: 1、Python 就使用文件包当中的版本,由于python 版本能与 future 及 pip 之间存在特定的组合关系,故不推荐下载使用最新版本 2、安…...
SSM项目集成redis、Linux服务器安装redis
在SSM(Spring Spring MVC MyBatis)项目中引入Redis主要分为以下步骤,确保配置正确并能在业务中灵活使用: 1. 添加Redis依赖 在Maven的pom.xml中添加Spring Data Redis和Jedis(或Lettuce)依赖&#…...
sqli-labs靶场第七关——文件导出注入
一:目标 通过sql注入将php代码写入网站目录,通过这个php文件执行命令 二:确认前置条件 %secure_file_priv% 首先我们需要Mysql是否允许导出文件 先尝试在网页中sql注入,检查导出权限 ?id1)) union select 1,secure_file_pr…...
python使用matplotlib无法显示中文字体报错
python使用matplotlib字体报错 当我们使用python使用matplotlib总是出现报错,图片中文变成方框 findfont: Font family WenQuanYi Micro Hei not found. findfont: Font family Heiti TC not found. findfont: Font family [SimHei] not found. Falling back to De…...
VTEP是什么
VTEP(VXLAN Tunnel Endpoint,VXLAN 隧道端点)是 VXLAN(Virtual Extensible LAN)网络中的关键组件,用于处理 VXLAN 流量的封装和解封装。以下以可读的 Markdown 格式详细解释 VTEP 的定义、功能、实现方式以…...
React Native简介
React Native 是由 Meta(原 Facebook)开源的跨平台移动应用开发框架,基于 React 和 JavaScript,允许开发者使用同一套代码库构建 iOS 和 Android 原生应用。通过 JavaScript 调用原生组件实现高性能渲染。 跨平台开发 共享 80%-9…...
边缘计算模块
本文来源 :腾讯元宝 边缘计算模块是一种部署在网络边缘(靠近数据源)的集成化硬件/软件设备,用于实时处理本地数据,减少云端依赖,提升响应速度与安全性。以下是其核心要点: 1. 核心组成 …...
策略模式-枚举实现
策略模式的实现方法有很多,可以通过策略类if,else实现。下面是用枚举类实现策略模式的方法。 定义一个枚举类,枚举类有抽象方法,每个枚举都实现抽象方法。这个策略,实现方法是工具类的很实现,代码简单好理解 枚举实现…...
C++算法(22):二维数组参数传递,从内存模型到高效实践
引言 在C程序设计中,二维数组的参数传递是许多开发者面临的棘手问题。不同于一维数组的相对简单性,二维数组在内存结构、类型系统和参数传递机制上都存在独特特性。本文将深入探讨静态数组、动态数组以及STL容器三种实现方式,通过底层原理分…...
LeetCode LCR 015. 找到字符串中所有字母异位词 (Java)
LCR 015. 找到字符串中所有字母异位词 题目描述 给定两个字符串 s 和 p,要求找到 s 中所有是 p 的变位词(字母相同但排列不同)的子串,并返回这些子串的起始索引。例如: 输入 s "cbaebabacd", p "a…...
幼儿学前教育答辩词答辩技巧问题答辩自述稿
### 📘《幼儿园大班活动开展存在的问题及解决策略》📝 我的论文题目是《幼儿园大班活动开展存在的问题及解决策略》📖。我将从论文框架、研究内容、需要解决的问题、研究结论这四部分来阐述我的论文📝。 论文框架由绪论Ǵ…...
双目立体视觉
文章目录 1,前言2,原理3,组成部分3.1,数字图像采集。3.2 ,相机标定。3.3,图像预处理与特征提取。3.4 ,图像校正。3.5 ,立体匹配。3.6 ,三维重建。 4,主要的算…...