C++基本知识 —— 缺省参数·函数重载·引用
C++基本知识 —— 缺省参数·函数重载·引用
- 1. 缺省参数
- 2. 函数重载
- 3. 引用
- 3.1 引用的基础知识
- 3.2 引用的作用
- 3.3 const 引用
- 3.4 指针与引用的关系
1. 缺省参数
什么是缺省参数?缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数的时候,如果没有指定实参则采用该形参的缺省值(默认值),否则使用指定的实参。缺省参数也就做默认参数,缺省值一般都是字面量常量,也可以是全局变量;传参时实参只能从左向右传,且若传参时,只传了一个实参,那么函数的参数列中的第一个形参的值就是这个实参的值;缺省参数分为全缺省和半缺省参数。全缺省就是全部形参使用的都是缺省值。下面用具体的代码来解释上述概念:
// 这就是一个全缺省函数
void Func(int x = 10, int y = 20, int z = 30)
{cout << "x = " << x << "\ty = " << y << "\tz = " << z << endl;
}int main()
{//不传参 x y z 使用的都是缺省值Func(); //只传一个实参,那么 x 会使用指定的实参,y z 使用的是缺省值Func(1);//传两个实参,那么 x y 会使用指定的实参,z 使用的是缺省值Func(1, 2);//全部都传实参,那么 x y z 都会使用指定的实参Func(1, 2, 3);return 0;
}
运行结果:
C++规定在传实参时,不能间隔跳跃传参,只能从左到右连续的传,如下所示:
// 这样传参是错误的
Func(1, , 3);
Func(, 2, 3);
半缺省就是一部分的形参使用的是缺省值,且半缺省参数的缺省值得要从右往左给,不能从左往右给,也不能跳跃给缺省值,如下所示:
//半缺省函数
void Func(int x, int y = 20, int z = 30)
{cout << "x = " << x << "\ty = " << y << "\tz = " << z << endl;
}void Func(int x, int y, int z = 30)
{cout << "x = " << x << "\ty = " << y << "\tz = " << z << endl;
}
为什么必须要从右往左给形参缺省值呢?为什么不能从左往右给缺省值呢?具体原因如下所示:
void Func(int x = 10, int y = 20, int z)
{cout << "x = " << x << "\ty = " << y << "\tz = " << z << endl;
}int main()
{Func(1, 2);return 0;
}
当如上图所示传实参时:调用Func函数时,会产生歧义,不知道实参1和实参2的值是传给哪个形参,很明显实参2传递给形参 z 的,而实参1的值是传递哪个形参呢?是 x 还是 y ,这是不明确的,而从右往左给缺省值就不会存在这样的歧义:
void Func(int x, int y = 20, int z = 30)
{cout << "x = " << x << "\ty = " << y << "\tz = " << z << endl;
}int main()
{Func(1, 2);return 0;
}
第一个实参一定是传给第一个形参,第二个实参一定是传给第二个形参,不会存在什么歧义问题。若是传一个实参,那么这个实参一定是传给函数参数列表中的第一个形参;若是传两个实参,那么这两个实参一定是传给函数的参数列表中的前两个形参。
当函数为半缺省函数时,没有缺省值的形参必须要有与之相对应的实参,也就是说,至少要传一个实参。
函数的声明与定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值,缺省值不仅仅只能是具体的值,还可以是表达式。如下所示:
声明:
定义:
2. 函数重载
什么是函数重载?函数重载指的是:一个函数名可以有多重的意义。C++中支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,而C语言不支持。
int Add(int x, int y)
{return x + y;
}double Add(double x, double y)
{return x + y;
}short Add(short x, short y)
{return x + y;
}//……………………
这里的参数不同可以是参数的数据类型不同,参数的个数不同,参数的顺序不同,如下所示:
//以下两个 Add 函数构成函数重载 —— 参数类型不同
int Add(int x, int y)
{return x + y;
}double Add(double x, double y)
{return x + y;
}//以下两个 Add 函数构成函数重载 —— 参数个数不同
short Add(short x, short y)
{return x + y;
}short Add(short x, short y, short z)
{return x + y + z;
}//以下两个 Add 函数构成函数重载 —— 参数顺序不同
long Add(int x, long y)
{return x + y;
}int Add(long x, int y)
{return x + y;
}
但是有时构成重载的两个函数在被调用时会产生歧义,如下代码所示:
//以下两个 Func 函数构成函数重载 —— 参数的个数不同
void Func()
{cout << "Func( )" << endl;
}void Func(int n = 4)
{cout << "Func( int n )" << endl;
}
若是传参调用 Func 函数,调用的一定是第二个 Func 函数;若是不传参调用,那会调用哪个函数?其实这两个函数都会调用,因为无参的函数既可以调用本就是无参的函数,也可以调用全缺省函数。这时代码就会报错,解决方法是不要将这两个函数同时写,用第二个函数去替代。
注意:函数的返回值类型不同不能作为函数重载的条件,因为返回值可以不被接收。
3. 引用
3.1 引用的基础知识
引用的概念:引用不是新定义一个变量,而是给已存在的变量取了一个别名。引用的定义:类型& 引用别名 = 引用对象。如下所示:
// ra 就是 a 的别名
int a = 10;
int& ra = a;
编译器不会为引用变量开辟内存空间,引用变量和引用对象共用同一块内存空间:
由此图就可以得知引用变量与引用对象指向的是同一块内存空间,ra 和 a 的地址都是一样的,且变量的值也是一样的。
对引用变量操作还会改变其引用对象,如下所示:
ra 和 a 的值都被改变了。
此外也可以对同一个变量取多个别名,也可以对别名取别名,如下所示:
它们的值是一样的,地址也是一样的。
在引用中尤其要注意以下的代码:
int x = 20;
int& rx = x;
int y = 30;
rx = y;
请问这里的 rx = y 是在给 y 取别名吗?而 y 的别名是 rx 吗?其实并不是,这里只是将 y 的值赋值给了 rx ,修改了 rx 和 x 的值,来看一下调试窗口:
这里就说明了引用不会改变指向,只要它是一个变量的引用,那么它永远都是那个变量的别名,没有语法能改变引用的指向。C++为了区分引用与取地址,只有&跟在类型的后面才称之为引用,单独一个&是取地址操作符,对变量执行取地址操作。
根据上述的分析,总结出引用的特性:
1. 引用在定义时必须初始化
2. 一个变量可以有多个引用
3. 引用一旦引用一个实体,就不能再引用其它实体了
3.2 引用的作用
在C语言中,若想要交换两个变量的值,需要将这两个变量的地址传给形参,如此才能完成两个变量值的交换;但是在C++中,可以使用引用,如下所示:
// rx 是 x 的别名,ry 是 y 的别名
void Swap(int& rx, int& ry)
{int tmp = rx;rx = ry;ry = tmp;
}int main()
{int x = 10;int y = 20;cout << "交换前:x = " << x << "\ty = " << y << endl;Swap(x, y);cout << "交换后:x = " << x << "\ty = " << y << endl;return 0;
}
运行结果:
由此可以得出引用的功能:做函数的参数,修改形参影响实参。
在C语言中,使用传值传参时,若实参的内存很大,那么往往会改为传址传参,因为这里会涉及拷贝问题;但是在C++中,可以使用引用,如下所示:
struct Test
{int arr[100000];int size = 0;int capacity = 0;
};// rtst 是 tst 的别名
void Func(struct Test& rtst)
{}int main()
{Test tst;Func(tst);return 0;
}
由此可以得出引用的功能:做函数的参数,减少拷贝,提高效率。
既然可以给整型变量取别名,那可不可以给指针变量取别名呢?当然可以。在C语言中,若想交换两个指针的内容,可以将指针的地址传给形参,也就是使用二级指针;在C++中,可以使用引用来解决这个问题:
void Swap(int*& rpx, int*& rpy)
{int* tmp = rpx;rpx = rpy;rpy = tmp;
}int main()
{int x = 10;int y = 20;int* px = &x;int* py = &y;cout << "交换前:px = " << px << "\tpy = " << py << endl;Swap(px, py);cout << "交换后:px = " << px << "\tpy = " << py << endl;return 0;
}
运行结果:
若想要修改函数的返回值该怎么做呢?可以使用传引用返回,那么为什么不能使用传值返回呢?首先得要理解一个概念,只要是传值返回,返回的都不是原来的值,都会拷贝生成一个临时变量,返回的是这个临时变量,下面来介绍具体原因:
由此可以得出引用功能:引用作为函数的返回值,如此就可以修改返回对象;当函数的返回值的内存较大时,用引用作为函数的返回值,可以减少拷贝,提高效率。
虽然引用非常的强大,但是并不是所有的函数都要用引用作为返回值,若所有的函数的返回值都用引用,那么会造成意想不到的后果,如下代码所示:
跟C语言中学的野指针一样,这里类似于野指针,由于是引用,可以称之为野引用。
当返回的对象出作用域后未被销毁,那么可以使用传引用返回;若返回的对象出作用域后被销毁了,则不可以使用传引用返回,应该使用传值返回。
从函数栈帧的角度去考虑:
所以并不是所有的函数都要用引用作为返回值,当函数变量为局部变量的时候,出了作用域该变量就销毁了,此时返回该局部变量的别名是一个危险的行为。
3.3 const 引用
1. 若想要引用一个const 对象,那么就必须要用使用 const 引用
int main()
{int x = 10;int& rx = x;const int y = 20;const int& ry = y;return 0;
}
若这里引用 const 修饰的对象时,并没有使用 const 引用,那么程序会报错,这是因为这里涉及到了权限的放大 —— 原本变量 y 被 const 修饰后不能被修改,现在对 y 取别名后,就可以通过修改别名来修改变量 y ,但是 y 本身是不能被修改的,别名却可以修改 y ,这样是不可取的。权限是不能放大的。const 引用也可以引用普通对象,因为普通对象的访问权限在引用过程中可以缩小,但是不能放大。如下所示:
int main()
{int x = 10;int& rx = x;const int& r = x;int& const p = x;return 0;
}
这里就涉及到了权限的缩小,之前 x 的值是可以修改的,但是现在被 const 引用修饰后,x 的值就不可以修改了,这就是权限的缩小。这里 const 写在类型的左右边都可以,但是一般写在类型的左边。
接下来根据以下代码来回答下面的问题:
int a = 1;
int& ra = a;
int b = a;
该代码涉及权限的放大或缩小吗?都不涉及,只有指针和引用才涉及权限的放大与缩小,这里只是将变量 a 的值赋值给变量 b 。
2. 要注意的是类似int& rb = a * 4;double c = 3.14;int& rc = c;这样一些场景下a * 4的结果保存在一个临时对象中;int& rc = c也是类似的情况,在类型转换时会将中间值用临时对象来保存。也就是说,rb与rc引用的都是临时对象,而C++规定临时对象具有常性。所以在这里就涉及到了权限的放大,必须要用const引用才行
int main()
{int a = 10;int b = 20;double c = 3.14;const int& r1 = a; //给变量取别名const int& r2 = b; //给变量取别名const int& r3 = 30; //给常量取别名 //将double类型的变量c的整型部分给给临时对象const int& r4 = c; //当表达式运算完毕后会计算出一个结果,这个结果存储在临时对象中//r5引用的是表达式运算的结果,也就是临时对象const int& r5 = a * 4; return 0;
}
之后在写函数的参数的时候,就使用引用来作为形参,视情况考虑是否加const。当函数的参数使用const引用后,参数就可以是临时对象了,使用 const 引用的好处是既可以接收普通变量,也可以接收 const 修饰的变量。如下代码所示:
int main()
{int a = 10;int b = 20;double c = 3.14;const int& r1 = a; const int& r2 = b; Func(r1);Func(r2);Func(10);Func(c);Func(a * 4);return 0;
}
3.4 指针与引用的关系
引用可以完全替代指针吗?当然是不可以的。指针有一个引用做不到的事情,就是改变指向。在数据结构中是时常要改变指向的,在这方面引用就无法做到了,必须使用引用。在实践中指针与引用相辅相承,功能有重叠性,但是各有各的特点,互相是不可替代的:
1. 语法概念上,引用是对一个对象的取别名,不会开辟空间;指针是存储一个对象的地址,需要开辟空间
2. 引用在定义时必须要初始化,指针可以初始化也可以不初始化,但是建议初始
3. 引用在初始化时引用一个对象后,就不能再引用其它对象了,而指针可以不断的改变其指向的对象
4. 引用可以直接访问其指向的对象,而指针需要解引用后,访问的才是其指向的对象
5. 指针很容易出现空指针和野指针问题,引用很少出现,引用使用起来更加的安全
6. sizeof的含义不同,引用结果为引用类型的大小,但是指针始终是地址空间的所占字节个数(32位机器平台下是4个字节,64位机器平台下是8个字节)
底层指针与引用之间的区别:
从指令汇编角度来看,引用是由指针实现的。
相关文章:
C++基本知识 —— 缺省参数·函数重载·引用
C基本知识 —— 缺省参数函数重载引用 1. 缺省参数2. 函数重载3. 引用3.1 引用的基础知识3.2 引用的作用3.3 const 引用3.4 指针与引用的关系 1. 缺省参数 什么是缺省参数?缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数的时候,如…...
大数据基础——Ubuntu 安装
文章目录 Ubuntu 安装一、配置电脑二、安装系统 Ubuntu 安装 一、配置电脑 1、进入VMware 2、选择配置类型 3、选择硬件兼容性版本 4、当前虚拟机的操作系统 选择“稍后安装操作系统”(修改) 5、选择虚拟机将来需要安装的系统 选中“Linux”和选择…...
英伟达微调qwen2.5-32B模型,开源推理模型:OpenCodeReasoning-Nemotron-32B
一、模型概述 OpenCodeReasoning-Nemotron-32B 是一个大型语言模型,基于 Qwen2.5-32B-Instruct 开发,专为代码生成推理任务进行了后续训练,支持 32,768 个标记的上下文长度,适用于商业和非商业用途。 二、性能表现 在 LiveCode…...
苍穹外卖-创建阿里云oss工具包
添加配置信息: sky:alioss:endpoint: ***access-key-id: ***access-key-secret: ***bucket-name: *** 把配置的内容转换成对象: Component ConfigurationProperties(prefix "sky.alioss") Data public class AliOssProperties {private St…...
代码随想录训练营第二十一天 |589.N叉数的前序遍历 590.N叉树的后序遍历
589.N叉数的前序遍历: 状态:已做出 思路: N叉树的前序遍历和二叉树很像,我这里使用栈来实现。首先把根结点入栈,然后删除栈顶节点后把栈顶节点的所有子树都插入到栈,这里需要注意的是插入的方式是从最后一…...
鸿蒙跨平台开发教程之Uniapp布局基础
前两天的文章内容对uniapp开发鸿蒙应用做了一些详细的介绍,包括配置开发环境和项目结构目录解读,今天我们正式开始写代码。 入门新的开发语言往往从Hello World开始,Uniapp的初始化项目中已经写好了一个简单的demo,这里就不再赘述…...
面试中常问的设计模式及其简洁定义
🎯 一、面试中常问的设计模式及其简洁定义 模式名常被问到解释(简洁)单例模式✅ 高频保证一个类只有一个实例,并提供全局访问点。工厂模式✅ 高频创建对象的接口由子类决定,屏蔽了对象创建逻辑。抽象工厂模式✅提供多…...
关于 js:6. 网络与加密模块
一、AJAX AJAX(Asynchronous JavaScript And XML) 异步 JavaScript 与 XML(现在多为 JSON) 它允许网页在不重新加载整个页面的情况下,从服务器请求数据并更新页面内容。 主要用途: 提交表单时无需刷新页…...
量化交易系统开发经验分享--回测框架调研
一、前言 这段时间在集中做一个量化交易系统的开发任务,目前系统的MVP已经完成开发,后续会整理一些经验与成果和大家交流。刚好有一个前期做策略回测这块的调研,下面把调研的成果做一个整理总结先给大家分享一下,请批评指正。 在介…...
[学习]RTKLib详解:convkml.c、convrnx.c与geoid.c
本文是 RTKLlib详解 系列文章的一篇,目前该系列文章还在持续总结写作中,以发表的如下,有兴趣的可以翻阅。 [学习] RTKlib详解:功能、工具与源码结构解析 [学习]RTKLib详解:pntpos.c与postpos.c [学习]RTKLib详解&…...
【ajax基础】
提示:文章为 学习过程中的记录实践笔记。有问题欢迎指正。 文章目录 前言一、实现步骤二、完整示例三、封装总结 前言 AJAX 不是编程语言,是一种从网页访问web服务器的技术。 可以实现不刷新页面更新网页 在页面加载后从服务器请求/获取数据 在后台向服…...
Nodejs核心机制
文章目录 前言 前言 结合 Node.js 的核心机制进行说明: 解释事件循环的各个阶段。 答案 Node.js 事件循环分为 6 个阶段,按顺序执行: Timers:执行 setTimeout 和 setInterval 的回调。 Pending I/O Callbacks:处理系…...
Kubernetes 集群部署应用
部署 Nginx 应用 命令行的方式 1. 创建 deployment 控制器的 pod # --imagenginx:这个会从 docker.io 中拉取,这个网站拉不下来 # kubectl create deployment mynginx --imagenginx# 使用国内镜像源拉取 kubectl create deployment mynginx --imaged…...
【Linux篇】高并发编程终极指南:线程池优化、单例模式陷阱与死锁避坑实战
深入理解线程池设计与应用:高效并发编程的秘密 一. 线程池1.1 什么是线程池1.2 线程池的优点1.3 线程池的应用场景 二. 线程池设计三. 单例模式3.1 什么是单例模式3.2 单例模式特点3.3 实现单例模式方法3.3.1 饿汉实现⽅式3.3.2 懒汉实现⽅式 四. 线程安全和重入问题…...
学习和测试WebApi项目限制客户端ip访问接口(基于中间件)
WebApi项目需要限制仅允许有限的客户端访问接口,百度相关内容,网上很多介绍WebApi接口IP限流的文章,稍微调整就能用于限制IP访问,微软官网中也有文章介绍客户端 IP 安全列表(参考文献1),可以通过…...
闲鱼智能客服机器人-实现闲鱼平台7×24小时自动化值守
专为闲鱼平台打造的AI值守解决方案,实现闲鱼平台724小时自动化值守,支持多专家协同决策、智能议价和上下文感知对话。 🌟 核心特性 智能对话引擎 功能模块技术实现关键特性上下文感知会话历史存储轻量级对话记忆管理,完整对话历…...
Apache Ranger 2.2.0 编译
安装包下载: https://ranger.apache.org/download.html 编译环境: Linux centos7jdk 1.8maven 3.9.6gitpython 3 git 安装 yum -y install gitpython3安装 yum install epel-release -y yum install python3 python3-devel -y批量安装开发工具套件 …...
实战演练:用 AWS Lambda 和 API Gateway 构建你的第一个 Serverless API
实战演练:用 AWS Lambda 和 API Gateway 构建你的第一个 Serverless API 理论千遍,不如动手一遍!在前面几篇文章中,我们了解了 Serverless 的概念、FaaS 的核心原理以及 BaaS 的重要作用。现在,是时候把这些知识运用起来,亲手构建一个简单但完整的 Serverless 应用了。 …...
鱼眼相机生成-BEV鸟瞰图-入门教程
目录 原理介绍 1. IPM与BEV转换的核心原理 2. 尺度信息的来源 3. 尺度信息的准确性限制 4. 实际应用中的处理方法 代码实现: 360 BEV环视拼接算法 一、核心算法流程 三、实际应用挑战与优化 四、开源实现参考 原理介绍 1. IPM与BEV转换的核心…...
设计模式简述(十八)享元模式
享元模式 描述基本组件使用 描述 当内存中存在大量类似的对象时,可以考虑使用享元模式减少整体内存占用。 可以将相同的部分和不同的部分进行拆分,以达到多个对象共享相同部分内存的目的。 基本组件 通常享元对象通过共享的属性映射一个享元对象。 公…...
Google语法整理
以下是从整理出的 Google 语法: site:指定域名,如 “apache site:bbs.xuegod.cn”,可查询网站的收录情况 。 inurl:限定在 url 中搜索,如 “inurl:qq.txt”,可搜索 url 中包含特定内容的页面&a…...
【每日一题 | 2025年5.5 ~ 5.11】搜索相关题
个人主页:Guiat 归属专栏:每日一题 文章目录 1. 【5.5】P3717 [AHOI2017初中组] cover2. 【5.6】P1897 电梯里的尴尬3. 【5.7】P2689 东南西北4. 【5.8】P1145 约瑟夫5. 【5.9】P1088 [NOIP 2004 普及组] 火星人6. 【5.10】P1164 小A点菜7. 【5.11】P101…...
【MySQL】页结构详解:页的大小、分类、头尾信息、数据行、查询、记录及数据页的完整结构
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
C++ stl中的priority_queue的相关函数用法
文章目录 priority_queuepriority_queue定义方式priority_queue相关函数 priority_queue priority_queue 称为 优先级队列,默认使用vector作为底层存储数据的容器,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用…...
软件架构师知识点总结
一、综合知识 软件架构师综合知识总结-CSDN博客 二、案例 软件架构师案例知识点总结-CSDN博客 三、论文 1、题目类型:八大架构;系统开发(开发方法/模型、需求分析、测试等);系统可靠性、安全性、容错技术等&#…...
MySQL数据库常见面试题之三大范式
写在前面 此文章大部分不会引用最原始的概念,采用说人话的方式。 面试题:三大范式是什么?目的是什么?必须遵循吗? 假设有一张表(学号,姓名,课程,老师) 是…...
Scrapy 核心组件解析:Request Response 的深度应用与实战
Scrapy 是 Python 生态中最强大的爬虫框架之一,其核心组件 Request 和 Response 承担着数据抓取与处理的关键任务。本文深入解析 Scrapy 2.13.0 中 Request 和 Response 的高级用法,涵盖参数配置、回调函数、错误处理、子类扩展等,并结合 综合…...
mybatis执行sql过程
一、配置加载阶段 1. 读取全局配置(mybatis-config.xml) 入口类:SqlSessionFactoryBuilder.build()关键组件: XMLConfigBuilder:解析全局配置文件。Configuration:存储所有配…...
OceanBase 4.3版本向量数据库部署
OceanBase 4.3版本向量数据库部署 安装包准备最低资源配置重要的准备事项服务器配置操作系统内核参数BIOS设置磁盘挂载网卡设置 部署OAT工具初始化OBServer服务器使用oatcli部署OB集群安装OceanBase软件初始化OceanBase集群 启用向量检索功能 OceanBase最新的V4.3版本开始支持向…...
LeetCode 941. 有效的山脉数组 java题解
https://leetcode.cn/problems/valid-mountain-array/description/ 双指针 class Solution {public boolean validMountainArray(int[] arr) {int lenarr.length;if(len<3) return false;int left0,rightlen-1;while(left1<len&&arr[left]<arr[left1]){left…...
基于Java和高德开放平台的WebAPI集成实践-以搜索POI2.0为例
目录 前言 一、高德搜索API简介 1、高德开放平台 2、搜索功能介绍 3、部分API介绍 二、Uniapi集成高德API 1、API集成流程 2、访问接口的定义 3、业务调用集成 三、常见问题与优化 四、总结 前言 在当今数字化时代,地理信息系统(GISÿ…...
Docker拉取ubuntu22.04镜像使用ROS2 humble及仿真工具可视化进行导航
创建Ubuntu22.04 容器 docker pull ubuntu:22.04 #下载22.04镜像 docker images #查看已下载镜像 #根据镜像创建容器 sudo docker run -it -v /home/lab118/BD_ICL/tools_BD/cailib_data:/calib_data -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY:0 --nethost -e GDK_SCAL…...
PXE安装Ubuntu系统
文章目录 1. 服务器挂载Ubuntu镜像2. 修改dhcp配置文件3. 修改tftp配置文件4.复制网络驱动文件和其他配置文件5. http目录下配置文件6. 踩坑记录6.1 Failed to load ldlinux.c326.2 no space left on device6.3 为啥用pxe安装系统时,客户端需要较大的内存࿱…...
外网访问内网海康威视监控视频的方案:WebRTC + Coturn 搭建
外网访问内网海康威视监控视频的方案:WebRTC Coturn 需求背景 在仓库中有海康威视的监控摄像头,内网中是可以直接访问到监控摄像的画面,由于项目的需求,需要在外网中也能看到监控画面。 实现这个功能的意义在于远程操控设备的…...
缓存局部性保留
在操作系统中,线程切换相比进程切换更轻量级的关键原因之一是 缓存(Cache)的有效性,尤其是对 CPU 缓存(如 L1/L2/L3)和 TLB(Translation Lookaside Buffer)的影响。以下从缓存角度详…...
MyBatis源码解读5(3.1、缓存简介)
3.1、简介 我们需要记住一句话,程序与数据库之间的交互是性能瓶颈的关键,所以我们在做优化的时候,数据库的优化要做,但是优先级是最低的,比它优先级高的是方面是程序与数据库之间的交互,先从宏观上解决…...
【MySQL】行结构详解:InnoDb支持格式、如何存储、头信息区域、Null列表、变长字段以及与其他格式的对比
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
Docker 部署Nexus仓库 搭建Maven私服仓库 公司内部仓库
介绍 Nexus 是广泛使用的仓库管理工具,常用于管理 Java 构件(如 JAR、WAR、EAR 文件)。它可以作为一个本地的 Maven 仓库,用来存储和管理项目的依赖包和构建产物。支持多种仓库类型,能够帮助开发团队更高效地管理构件…...
PostgreSQL 的 pg_column_size 函数
PostgreSQL 的 pg_column_size 函数 pg_column_size 是 PostgreSQL 提供的一个系统函数,用于返回特定列或值在数据库内部存储时所占用的字节数。这个函数对于数据库优化、存储空间分析和性能调优非常有用。 函数语法 pg_column_size(anyelement)参数说明 anyele…...
【前端】【HTML】【总复习】一万六千字详解HTML 知识体系
🌐 HTML 知识体系 一、HTML 基础入门 1. HTML 简介与作用 HTML(HyperText Markup Language,超文本标记语言)是构建网页的基础语言。它的核心作用是: 定义网页内容的结构(标题、段落、图片、表格等)提供语义化标签,帮助搜索引擎与辅助设备理解页面内容配合 CSS 实现…...
支持向量机与逻辑回归的区别及 SVM 在图像分类中的应用
支持向量机与逻辑回归的区别及 SVM 在图像分类中的应用 在机器学习的多元算法领域中,支持向量机(SVM)和逻辑回归(LR)作为两种经典的监督学习算法,被广泛应用于各类分类任务。尽管它们有着相似的目标&#…...
MySQL基础面试题集锦
MySQL基础面试题集锦 一、SQL基础语法 1. 数据库和表操作 -- 创建数据库 CREATE DATABASE test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;-- 创建表 CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,email VARCH…...
【网络分析工具】网络工具wireshark、TCPdump、iperf使用详解
这里写目录标题 1. wireshark1.1. 过滤包1.2. 常见分析 2. tcpdump3. iperf 1. wireshark **ip.dst eq 10.0.0.21** 是用于网络流量分析工具(例如 Wireshark 或 tcpdump)的过滤器表达式。 它的作用是筛选出所有目标IP地址为 10.0.0.21 的数据包 IP.add…...
【漫话机器学习系列】253.超平面(Hyperplane)
超平面(Hyperplane)详解:从二维到高维空间 在机器学习、深度学习、支持向量机(SVM)等领域中,经常会遇到一个重要的数学概念——超平面(Hyperplane)。但超平面究竟是什么?…...
#微调重排序模型:Reranking从入门到实践
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...
vector 常见用法及模拟
文章目录 1. vector的介绍与使用1.1 vector的构造1.2 vector iterator 的使用1.3 有关大小和容量的操作1.4 vector 增删查改1.5 vector 迭代器失效问题(重点)1.6 vector 中二维数组的使用 2. vector 的模拟实现2.1 拷贝构造和赋值重载的现代写法2.2 memc…...
可变参数模板
引入:为什么会有可变参数模板? 在C98/03中,也就是我们之前学的类模版和函数模版中只能含固定数量的模版参数,而C11中新增的可变参数模板能够不固定数量的模版参数! 一:可变参数模板的格式 // Args是一个模板…...
缓存(5):常见 缓存数据淘汰算法/缓存清空策略
主要的三种缓存数据淘汰算法 FIFO(first in first out):先进先出策略,最先进入缓存的数据在缓存空间不够的情况下(超出最大元素限制)会被优先被清除掉,以腾出新的空间接受新的数据。策略算法主要比较缓存元素的创建时…...
深入了解linux系统—— 自定义shell
shell的原理 我们知道,我们程序启动时创建的进程,它的父进程都是bash也就是shell命令行解释器; 那bash都做了哪些工作呢? 根据已有的知识,我们可以简单理解为: 输出命令行提示符获取并解析我们输入的指令…...
【通讯录教程】如何将号码快速导入手机通讯录,支持苹果和安卓手机,一次性导入大量号码进入手机通讯录,基于WPF的解决方案
以下是一个基于WPF的解决方案,用于将大量号码快速导入苹果和安卓手机通讯录: 项目应用场景 企业员工通讯录批量导入:HR需要将数百名员工的联系方式快速导入公司手机客户关系管理:销售人员需要将大量客户信息导入…...