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

C++入门-引用

C++入门-引用

  • 前置知识点:函数栈帧的复用
  • 前置知识点:类型转换时产生的临时变量
  • 1.含义
  • 2.代码形式
  • 3.引用的价值
    • 1.传参数
      • 传参效率测试
      • 补充:C++与Java中引用的区别
    • 2.引用做返回值(前置知识:栈帧复用)
      • 1.传值返回
      • 2.传引用返回
      • 传引用返回并用引用接收
      • 3.静态变量传引用返回
      • 4.引用做返回值真正的价值
  • 4.常引用(前置知识:类型转换时产生的临时变量)
  • 5.引用的底层实现
  • 6.引用和指针的区别

注意:引用的价值无法再这一节中全部说完,引用的更大价值在类和对象当中有所体现

前置知识点:函数栈帧的复用

首先请大家看一句话:

时间是一去不复返的
而空间是可以重复利用的

结合我们的日常生活,这句话没毛病,同样的,在C和C++中也是如此

其中空间是可以重复利用的这一点就被函数栈帧的复用所深刻地体现出来了
其中函数栈帧的销毁并不是说把这块内存空间销毁了,而是把这块内存空间的管理权归还给操作系统了,而申请内存空间就是向操作系统申请一块内存空间的管理权

释放空间就像是酒店退房间一样,退了的房间还能再租给下一个客人

下面写一份代码让大家更清晰的看一下

在这里插入图片描述
如图我们可以看出test1函数跟test2函数相继调用,在test1函数的栈帧销毁之后,再建立了test2函数的栈帧

我们发现a和b的地址相同,这也就说明了函数栈帧的复用

为什么a和b的地址会相同呢?
1.函数栈帧的复用
2.a和b的都是同大小的变量

如果我们修改一下test2函数的代码
在这里插入图片描述
我们发现,a和x的地址相同,但是a跟b的地址不相同了,
这个说明了即使函数内部所使用的空间大小不同,但是依然会进行函数栈帧的复用

所有的函数相继调用时都会复用上一个战帧
只不过开的栈帧的大小不同

这里先介绍一下函数栈帧的复用,为了后面讲解引用作为返回值的地方打下基础

前置知识点:类型转换时产生的临时变量

类型转换会产生临时变量!!!,临时变量具有常性,也就是不能再被修改了

在这里插入图片描述

1.含义

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。

C++对C语言最大的改进:引用
因为C++设计者极其不喜欢指针,认为指针太麻烦
在语法上讲:引用就是取别名

2.代码形式

int main()
{int a = 1;int b = a;//把a的值拷贝给b//c是a的别名//c和a共用一块内存空间int& c = a;b++;cout << a << endl;//1c--;cout << a << endl;//0//取多少别名都可以//也就是说一个对象可以有多个引用int& d = a;//这么取别名也可以(也可以给别名取别名)int& e = d;//a,c,d,e的地址是一样的cout << &a << endl;cout << &c << endl;cout << &d << endl;cout << &e << endl;/*0031FC380031FC380031FC380031FC38*/return 0;
}

3.引用的价值

1.传参数

引用还可以再传参的时候提升效率,不用再去额外的开辟空间

比方说我们要实现一个Swap函数交换两个整形变量

void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}
//这两个函数构成重载
void Swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}
int main()
{int num1 = 1, num2 = 2;Swap(&num1, &num2);cout << num1 << " " << num2 << endl;Swap(num1, num2);cout << num1 << " " << num2 << endl;/*2 11 2*/return 0;
}

学习了引用之后,我们就能对单链表进行优化了
在这里插入图片描述
在这里插入图片描述
单链表是不可以传入一级指针建表的,除非你虚拟一个哨兵位的头节点,但是不推荐这样做
在这里插入图片描述
这里传入的实参是一个一级指针,如果传入的那个一级指针是一个NULL指针的话,如果我们的形参也是一个一级指针的话,只能改变这个结构体的成员
(可以改变next指针,增长这个链表的长度)
无法改变这个指针本身(因为形参的改变不会影响实参)

也就是说如果传入的这个链表不是空链表的话,传一级指针可以
但是如果传入的是一个空链表,想要改变这个空链表,那么只能传二级指针
在这里插入图片描述
这里SListPushBack(LNode** pphead,int x);
中的*pphead就是传入的plist

但是传二级指针未免有些麻烦了吧,但是引用可以让我们继续只需要传一级指针

typedef struct ListNode
{struct ListNode* next;int val;
}LNode,*PLNode;//PLNode:结点指针的typedef,也就是一个结构体指针
LNode* CreateNode(int x)
{LNode* newnode = (LNode*)malloc(sizeof(LNode));if (newnode == NULL){perror("malloc fail");exit(-1);}newnode->val = x;newnode->next = NULL;return newnode;
}
//二级指针版本
void SListPushBack(LNode** pphead, int x)
{LNode* newnode = CreateNode(x);if (*pphead == NULL){//没有头节点*pphead = newnode;}else{//找尾指针,再链接newnodeLNode* tail = *pphead;while (tail->next){tail = tail->next;}tail->next = newnode;}
}//phead是plist2的一个别名,也就是说phead就是plist2
void SListPushBack1(PLNode& phead, int x)
{PLNode newnode = CreateNode(x);if (phead == NULL){//没有头节点phead = newnode;}else{//找尾指针,再链接newnodePLNode tail = phead;while (tail->next){tail = tail->next;}tail->next = newnode;}
};
//phead是plist3的一个别名,也就是说phead就是plist3
void SListPushBack2(LNode*& phead, int x)
{LNode* newnode = CreateNode(x);if (phead == NULL){//没有头节点phead = newnode;}else{//找尾指针,再链接newnodeLNode* tail = phead;while (tail->next){tail = tail->next;}tail->next = newnode;}
};void SListPrint(LNode* phead)
{LNode* cur = phead;while (cur){cout << cur->val << " -> ";cur = cur->next;}cout << endl;
}int main()
{LNode* plist1 = NULL;SListPushBack(&plist1, 1);SListPushBack(&plist1, 2);SListPushBack(&plist1, 3);SListPushBack(&plist1, 4);SListPrint(plist1);PLNode plist2 = NULL;SListPushBack1(plist2, 1);SListPushBack1(plist2, 2);SListPushBack1(plist2, 3);SListPushBack1(plist2, 4);SListPrint(plist2);LNode* plist3 = NULL;SListPushBack2(plist3, 1);SListPushBack2(plist3, 2);SListPushBack2(plist3, 3);SListPushBack2(plist3, 4);SListPrint(plist3);/*1 -> 2 -> 3 -> 4 ->1 -> 2 -> 3 -> 4 ->1 -> 2 -> 3 -> 4 ->*/return 0;
}

传参效率测试

那么引用传参比起值传参来效率的提升能有多大呢?
我们来测试一下:
在这里插入图片描述
可见引用传参比起值传参还是有一定效率提升的,不过比起指针传参来,效率提升并不是很大,因为传指针也就多开辟4或者8个字节而已

补充:C++与Java中引用的区别

既然引用这么好,那么是不是C++就可以跟Java一样不需要指针了?
答案是:并不是这样的,C++中指针和引用是相辅相成的两种语法,缺一不可
而Java中的确不需要指针

为什么呢?

int main()
{int a = 10;int& b = a;int c = 16;//请问:b=c;这行代码是什么意思?//选项1:b不再是a的别名,而是成为了c的别名//选项2:b和a赋值为cb = c;cout << "&a = " << &a << endl;cout << "&b = " << &b << endl;cout << "&c = " << &c << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;return 0;
}

请大家先结合我们所学过的指针的特性来选择一下
在这里插入图片描述
选项2是正确的,也就是说b依然是a的别名,只不过a(也就是b)的值被赋值为16而已

但是如果是指针的话,情况就不一样了

int main()
{int a = 10;int* b = &a;int c = 16;b = &c;cout << "&a = " << &a << endl;cout << "b = " << b << endl;cout << "&c = " << &c << endl;cout << "a = " << a << endl;cout << "*b = " << *b << endl;cout << "c = " << c << endl;return 0;
}

在这里插入图片描述
在这里插入图片描述

2.引用做返回值(前置知识:栈帧复用)

引用的第二大价值:引用作为返回值

1.传值返回

下面我们来看一个函数

int Count()
{int n=0;n++;return n;
}

这里return n;
返回的并不是n,而是n的一个拷贝,这个拷贝是一个临时变量,具有常属性,
是一个右值,而不是左值

因为当Count函数调用完了之后Count函数的栈帧会销毁,所以再返回n的时候要先对返回值n进行拷贝,并把拷贝的临时变量返回给调用方,然后Count函数就可以安心的销毁了

2.传引用返回

int& Count()
{int n=0;n++;return n;
}

在这里插入图片描述
在这里插入图片描述

出了作用域,返回对象就销毁了,不能用引用返回,否则结果是不确定的

在这里插入图片描述
在这里尽管我们加上了这几行,不过也依然不会让ret变为随机值,
因为我们每次调用完Count时都会立即用ret来接收n,ret已经保存了n的值,
继续使用cout来开辟栈帧并不会影响ret的值
所以打印出来的依然是1

传引用返回并用引用接收

如果我们用引用去接收引用的返回值呢?

这样的话会有很多坑点,有很多程序的运行结果是无法解释的,
因为传引用返回本来就是个非常严重的错误,你还用引用接收,那错误更加严重了

这就像是薛定谔的猫,猫到底是死的还是活的你并不知道
到底是随机值还是原数值你也并不知道

这是给大家举的一些样例:
1.
在这里插入图片描述
第二次变成了随机值
2.
但是如果我们在两次cout当中再次调用Count函数的话
在这里插入图片描述
根据前面讲过的函数的栈帧复用原则,在第二次调用Count函数时新开辟的Count函数栈帧会复用第一次调用Count函数时开辟的栈帧,第二次调用Count函数时n的地址跟第一次的相等

而ret是通过引用接收的n,所以说ret就是n的别名,显然两次ret的地址也相同
在这里插入图片描述
所以两次ret的值也是1(VS编译器下)或者随机值

在这里插入图片描述
在这里第二次调用Add函数的时候,复用了第一次调用Add函数时所产生的栈帧,所以c的地址不变,值变为了7或者随机值

3.静态变量传引用返回

那么什么时候可以传引用返回呢?
1.堆上的数据
2.静态变量
反正只要不是局部变量就可以传引用返回(只要除了作用域后并没有销毁即可)

//局部的静态变量只初始化一次
//静态变量只在第一次调用的时候被初始化
int& Add1(int a, int b)
{static int c = a + b;return c;
}int& Add2(int a, int b)
{static int d;d = a + b;return d;
}int main014()
{int& ret = Add1(1, 2);cout << ret << endl;//3Add1(3, 4);cout << ret << endl;//3int& ret2 = Add2(1, 2);cout << ret2 << endl;//3Add2(3, 4);cout << ret2 << endl;//7return 0;
}

4.引用做返回值真正的价值

1:提高效率
2:后面在类和对象当中会有体现,到时候会详细说明的

这里先以静态的顺序表作为一个例子来看一下引用作为返回值的价值

//这里还没有对数组a进行初始化
//静态顺序表
typedef struct SeqList
{int a[100];int size = 100;
}SL;
#include <assert.h>
void SLModify(SL* ps,int pos,int x)
{assert(ps);assert(pos >= 0 && pos < ps->size);ps->a[pos] = x;
}
//应用于at函数
//这里要用引用返回:可以修改返回对象
//在类和对象当中有很广泛的作用
int& SLat(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);return ps->a[pos];
}
int main()
{SL sl;//想要修改顺序表,让每个位置的值++//这样做的话就很方便,比返回指针方便//后面还会有一些场景是指针解决不了的,必须要使用引用for (int i = 0; i < sl.size; i++){SLat(&sl, i)++;//SLat(&sl,i):想打印打印,想赋值赋值,想修改修改}return 0;
}

4.常引用(前置知识:类型转换时产生的临时变量)

引用跟指针类似,也存在const修饰的引用

权限放大只存在于引用和指针当中

const用于形参 修饰引用/指针
也叫做:预防性编程

int main016()
{const int a = 10;int& b = a;//err,这时b不能作为a的别名//因为a是常变量,不能修改,但是如果b又作为a的别名,但是b又不具有常属性,所以不能这样//这里的本质是权限的放大//权限可以不变,可以变小,但是不可以放大const int& b = a;//yes,权限没有变大int c = 20;const int& d = c;//yes,权限可以缩小const int& e = 10;//yes,可以的,因为e具有常属性,跟10都是不可以改变的,也就是说权限并未放大int& f = 10;//err,权限放大const int f = 10;int g = f;//可以,g是f的值拷贝,跟权限无关,g跟f不是同一块空间int i = 1;double j = i;double& k = i;//err,为什么不可以呢?const double& l = i;//这里是可以的,本质还是权限放大缩小的问题//类型转换会产生临时变量!!!!!!,临时变量具有常性,也就是不能再被修改了//所以加上const就行了return 0;
}

5.引用的底层实现

引用底层是用汇编实现的,是用指针实现的,也就是说引用在底层上是跟指针一样都开辟了空间的

但是语法上认为引用并没有开辟空间,认为引用就是取别名,语法上并不管底层是如何实现的

日常学习中我们以语法为主,认为引用没有开辟空间的

1.证明引用的底层跟指针一样

int main()
{int a = 10;int& b = a;int* ptr = &a;return 0;
}

我们查看汇编代码:
在这里插入图片描述
发现引用跟指针的汇编代码极其相似,也就证明了引用在底层上是通过指针实现的

2.证明在语法上引用并没有开辟空间

int main()
{//证明在语法上引用并没有开辟空间//语法上不管底层:char ch = 'x';char& r = ch;cout << sizeof(r) << endl;//1//底层上r开了4个或者8个字节,因为底层上引用是用指针实现的//但是语法上r就是char类型,就是1个字节return 0;
}

6.引用和指针的区别

引用和指针(更多是使用上和概念上的区别)

引用更加安全一些,但是引用不是绝对安全,只是相对指针来说更安全
引用也可能会出现"野引用"的情况,此时并不安全
在这里插入图片描述

以上就是C++入门-引用的全部内容,希望能对大家有所帮助,谢谢大家!

相关文章:

C++入门-引用

C入门-引用 前置知识点:函数栈帧的复用前置知识点:类型转换时产生的临时变量1.含义2.代码形式3.引用的价值1.传参数传参效率测试补充:C与Java中引用的区别 2.引用做返回值(前置知识:栈帧复用)1.传值返回2.传引用返回传引用返回并用引用接收3.静态变量传引用返回4.引用做返回值真…...

问题:Qt中软件移植到笔记本中界面出现塌缩

这是由于软件之前运行的设备DPI较低&#xff0c;移植到笔记本中显示设备DPI较高&#xff0c;导致窗体显示进行了缩放。 解决方案&#xff0c;在main.cpp中加入以下代码&#xff1a; if(QT_VERSION>QT_VERSION_CHECK(5,6,0)) QCoreApplication::setAttribute(Qt::AA_EnableHi…...

NDK编译脚本:Android.mk or CMakeLists.txt

本文来自于&#xff1a;https://github.com/xufuji456/FFmpegAndroid/blob/master/doc/NDK_compile_shell.md 前言 Android NDK以前默认使用Android.mk与Application.mk进行构建&#xff0c;但是在Android Studio2.2之后推荐使用CMake进行编译。 CMake是跨平台编译工具&#…...

低代码提速应用开发

低代码介绍 低代码平台是指一种能够帮助企业快速交付业务应用的平台。自2000年以来&#xff0c;低代码市场一直充斥着40大大小小的各种玩家&#xff0c;比如国外的Appian、K2、Pega Systems、Salesforce和Ultimus&#xff0c;国内的H3 BPM。 2015年以后&#xff0c;这个市场更是…...

Hi3516DV500 SVP_NNN添加opencv库记录

默认没有带opencv库&#xff0c;但是实际项目中需要用到opencv库&#xff0c;因此添加一下此库&#xff1b; 1&#xff1a;编译opencv源码&#xff0c;这里具体可以参考 海思Hi3516移植opencv以及错误调试_海思hi3516摄像头开发-CSDN博客 2&#xff1a;在工程的根目录下新建…...

BIO实战、NIO编程与直接内存、零拷贝深入剖析

原生 JDK 网络编程 BIO BIO&#xff0c;意为 Blocking I/O&#xff0c;即阻塞的 I/O。   BIO 基本上就是我们上面所说的生活场景的朴素实现。在 BIO 中类 ServerSocket 负责绑定 IP 地址&#xff0c;启动监听端口&#xff0c;等待客户连接&#xff1b;客户端 Socket 类的实例…...

计网第六章(应用层)(四)(电子邮件)

电子邮件采用客户/服务器的方式。 1、三个构成 电子邮件系统的三个组成构件&#xff1a;用户代理、邮件服务器以及电子邮件所需的协议。 用户代理是用户与电子邮件系统的接口&#xff0c;又称为电子邮件客户端软件。 邮件服务器是电子邮件系统的基础设施。因特网上所有的服…...

Lua篇笔记

. 和 : 的区别 lua的面向对象 Lua数据类型 nil number bool table string userdata thread function Lua-字符串连接 C#与Lua交互过程及原理 Lua中的闭包 常见的一些Lua功能 热重载&#xff1a; function reload_module(module_name) local old_module _G[module_name] --取…...

一种更具破坏力的DDoS放大攻击新模式

近日&#xff0c;内容分发网络&#xff08;CDN&#xff09;运营商Akamai表示&#xff0c;一种使网站快速瘫痪的DDoS放大攻击新方法正在被不法分子所利用。这种方法是通过控制数量巨大的中间设备&#xff08;middlebox&#xff0c;主要是指配置不当的服务器&#xff09;&#xf…...

WordPress 常规设置页面调用媒体中心上传图片插入URL(新版可用)

首先&#xff0c;我们需要在主题或插件文件夹中创建一个 JavaScript 文件&#xff08;如&#xff1a;media-uploader.js&#xff09;&#xff0c;该文件中包含如下代码。 /*** 媒体中心上传 js **/ jQuery(document).ready(function($){var mediaUploader;$(#upload_image_but…...

Elasticsearch实现检索词自动补全(检索词补全,自动纠错,拼音补全,繁简转换) 包含demo

Elasticsearch实现检索词自动补全 自动补全定义映射字段建立索引测试自动补全 自动纠错查询语句查询结果 拼音补全与繁简转换安装 elasticsearch-analysis-pinyin 插件定义索引与映射建立拼音自动补全索引测试拼音自动补全测试繁简转换自动补全 代码实现demo结构demo获取 自动补…...

LaunchView/启动页 的实现

1. 创建启动画板&#xff0c;LaunchScreen.storyboard 添加组件如图: 2. 项目中设置只支持竖屏&#xff0c;添加启动画板&#xff0c;如图: 3. 创建启动画面动画视图&#xff0c;LaunchView.swift import SwiftUI/// 启动视图 struct LaunchView: View {/// 字符串转换为字符串…...

windows安装npm教程

在安装和使用NPM之前&#xff0c;我们需要先了解一下&#xff0c;NPM 是什么&#xff0c;能干啥&#xff1f; 一、NPM介绍 NPM&#xff08;Node Package Manager&#xff09;是一个用于管理和共享JavaScript代码包的工具。它是Node.js生态系统的一部分&#xff0c;广泛用于构…...

网络端口验证

网络端口连通性验证 1、背景2、目标3、环境4、部署4.1、准备工作4.2、安装4.3、场景测试 1、背景 在日常运维过程中经常会遇到以下两种场景&#xff1a; 1、程序业务端口的开具及验证 2、业务程序访问异常网络排障 2、目标 1、验证端口的正确开具 2、网络策略的连通性 3、环…...

MongoDB 索引和常用命令

一、基本常用命令 1.1 案例需求 存放文章评论的数据存放到 MongoDB 中&#xff0c;数据结构参考如下&#xff0c;其中数据库为 articledb&#xff0c; 专栏文章评论 comment 字段名称 字段含义 字段类型 备注 _id ID ObjectId或String Mongo的主键的字段 articlei…...

【超详细】win10安装docker

win10安装docker 因为要在win10复现一个CVE漏洞&#xff0c;需要用到docker所以特地自己亲自安装了一下&#xff0c;其实在win10上安装docker与在Linux上面的原理一致&#xff0c;都是将docker安装在虚拟机里&#xff0c;不同的是win10是安装在Hyper-V虚拟机上的&#xff0c;需…...

JVM调优(一)

什么时候会有内存泄漏&#xff0c;怎么排查&#xff1f; 答&#xff1a; 首先内存泄漏是堆中的一些对象不会再被使用了&#xff0c;但是无法被垃圾收集器回收&#xff0c;如果不进行处理&#xff0c;最终会导致抛出 java.lang.OutOfMemoryError 异常。 内存泄露&#xff1a; …...

Parallels Desktop 19中文-- PD19最新安装

Parallels Desktop 19可以让我们在Mac电脑上运行Windows和其他操作系统&#xff0c;而无需重启计算机。这款软件的稳定性较高&#xff0c;能够在Mac上同时运行多个操作系统&#xff0c;如Windows、Linux等&#xff0c;而无需重启电脑。它可以让用户无缝地在不同操作系统之间切换…...

【c++】向webrtc学比较1:AheadOf、IsNewerTimestamp

webrtc源码分析-rtp序列号新旧比较 大神文章分析的非常到位。大神分析:AheadOrAt(a, b)是判断a是否比b新的核心,其原理是这样的:rfc1982规定了序列号递增间隔不能超过取值范围的1/2(这是自己理解的),那么要判断a是否比b新,只要判断b到a的递增是否在1/2即可,递增超过1/2,…...

华为云云耀云服务器L实例评测|企业项目最佳实践之docker部署及应用(七)

华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践系列&#xff1a; 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之云服务器介绍(一) 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之华为云介绍(二) 华为云云耀云服务器L实例评测&#xff5…...

MAC上使用Wireshark常见问题

文章目录 介绍正文启动异常-Permission denied解决方法 过滤协议和地址指定源地址和目的地址调整 time format 介绍 简单记录Wireshark在日常使用过程中的遇到的小case。 正文 Wireshark相较于tcpdump使用较为简单&#xff0c;交互也更为友好。 点击Start即可启动抓包 启动…...

在C++中++a和a++有什么区别?

2023年10月16日&#xff0c;周一中午 a和a在语义上的区别 a是先进行运算(增加1),然后返回新值。 a是先返回原值,然后进行运算(增加1)。 a和a在效率上的区别 a直接返回新值,不需要临时变量保存原值。 而a需要先返回原值,然后再进行增加1的操作。这需要使用一个临时变量来保存…...

NewStarCTF2023公开赛道-压缩包们

题目提示是压缩包 用010editor打开&#xff0c;不见PK头&#xff0c;补上50 4B 03 04 14 00 00 00 将文件改成.zip后缀&#xff0c;打开&#xff0c;解压出flag.zip 尝试解压&#xff0c;报错 发现一串base64编码 SSBsaWtlIHNpeC1kaWdpdCBudW1iZXJzIGJlY2F1c2UgdGhleSBhcmUgd…...

oracle数据库增加表空间数据文件

查询数据文件&#xff1a;select * from dba_data_files order by file_name; 增加&#xff1a;alter tablespace 数据库名 add datafile data size 34359721984;...

【08】基础知识:React中收集表单数据(非受控组件和受控组件)

一、概念 非受控组件&#xff1a; 页面中所有输入类的 DOM&#xff0c;现用现取。 给组件绑定 ref 属性&#xff0c;在需要时通过 ref 获取相应值。 受控组件&#xff1a; 页面中所有输入类的 DOM&#xff0c;随着输入&#xff0c;将内容维护到状态 state中&#xff0c;当…...

数据结构之堆排序和前,中,后,层序遍历,链式二叉树

首先我们要知道升序我们要建小堆&#xff0c;降序建大堆&#xff0c;这与我们的大多人直觉相违背。 因为我们大多数人认为应该将堆顶的数据输出&#xff0c;但如果这样就会导致堆顶出堆以后&#xff0c;堆结构会被破坏&#xff0c;显然我们不能这样。 所有我们反其道而行&…...

多线程中ThreadPoolExecutor.map()中传递多个参数

with concurrent.futures.ThreadPoolExecutor(max_threads) as executor:results executor.map(get_captcha_image, ip_addrs, [img_url] * len(ip_addrs)) #要传入多个参数时&#xff0c;每个参数都得是固定相同长度的可迭代对象# 收集结果for result in results:print(resul…...

linux centos7 环境下 no such file or directory

目录 1.问题描述2.主要原因2.1修改后代码2.2修改前代码 总结参考 1.问题描述 预览excel文件时无法找到对应的html文件 2.主要原因 异常原因&#xff1a;代码获取的是系统的tmp文件&#xff0c;但是linux环境环境中心tmp目录是没有权限的&#xff0c;所以不能获取系统的根目录…...

Nginx 反向代理 SSL 证书绑定域名

配置 Nginx 反向代理和 SSL 泛域名证书绑定域名 Nginx 是一个功能强大的 Web 服务器和反向代理服务器&#xff0c;可以用于将客户端请求转发到后端服务器&#xff0c;并提供安全的 HTTPS 连接。本文将介绍如何配置 Nginx 反向代理&#xff0c;并使用 SSL 泛域名证书绑定域名&a…...

SpringBoot 集成 JMS 与 IBMMQ 代码示例教程

文章目录 前言一、集成 JMS 与 IBMMQ1、pom 依赖2、yml 配置3、Properties 配置类4、Factory 连接工厂类5、配置连接认证6、配置缓存连接工厂7、配置事务管理器8、配置JMS模板9、消息发送与接收 总结 前言 SpringBoot 集成 IBMMQ&#xff0c;实现两个服务间的消息通信。 一、集…...

大模型之Prompt研究和技巧

大模型之Prompt研究和技巧 大模型之Prompt编写简介组成技术Zero-ShotFew-shotCOTCOT-SCTOTGoTReAct 大模型之Prompt编写 简介 Prompt是是给 AI **模型的指令&#xff0c;**一个简短的文本输入&#xff0c;用于引导AI模型生成特定的回答或执行特定任务。 Prompt是你与语言模型沟…...

掌握Golang匿名函数

一个全面的指南&#xff0c;以理解和使用Golang中的匿名函数 Golang以其简单和高效而闻名&#xff0c;赋予开发人员各种编程范式。其中一项增强代码模块化和灵活性的功能就是匿名函数。在这篇正式的博客文章中&#xff0c;我们将踏上探索Golang匿名函数深度的旅程。通过真实世…...

HarmonyOS云开发基础认证---练习题二

【判断题】 2/2 Serverless是云计算下一代的默认计算范式。 正确(True) 【判断题】 2/2 接入认证服务后&#xff0c;用户每次收到验证码短信都需要开发者买单。 错误(False) 【判断题】 2/2 认证服务手机号码登录需要填写国家码。 正确(True) 【判断题】 2/2 在Cloud Functi…...

ffmpeg视频解码器的配置选项含义

lowres的含义 lowres是AVCodecContext结构体中的一个成员变量&#xff0c;用于指定编解码器的降低分辨率级别。 在某些情况下&#xff0c;为了加快编解码的速度或减少计算资源的消耗&#xff0c;可以通过设置lowres参数来降低编解码器的分辨率级别。这将导致编解码器在处理视…...

enter ubuntu boot option in virt-manager

在全屏模型下&#xff0c;启动过程中按下F8或者Ctrl F8。 参考&#xff1a;https://serverfault.com/questions/463024/how-do-i-access-the-f8-bootmenu-while-booting-a-windows-2008r2-kvm-guest-vm...

电商运营该如何做 AB 测试

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 近年&#xff0c;电商行业进入了一个新的发展阶段&#xff0c;一方面电商市场规模持续扩大&#xff0c;另一方面直播电商、即时零售、社区团购等新兴电商业态在疫情…...

go环境部署

#env 命令查看 PATH 发现 #这两条环境变量是把 通过brew 安装的所有程序加入到环境变量中,其中就包含了go /opt/homebrew/sbin /opt/homebrew/bin#mac 系统 将原本 brew 安装的 go 1.20.5版本卸载 brew uninstall go #然后 去官网下载 https://go.dev/dl/ 想要的版本 1.21.0 …...

HTTP/2 中的漏洞

另一个热门漏洞是 CVE-2023-44487。 该漏洞与 HTTP/2 协议实施中的一个缺陷有关&#xff0c;可用于实施 DDoS 攻击。使用该漏洞的攻击被命名为 HTTP/2 快速重置。 为什么它很危险 要利用该漏洞&#xff0c;攻击者需要在 HTTP/2 会话中打开大量请求&#xff0c;然后在不等待服…...

智能油烟机 优化烹饪体验

如果说空调是夏天最伟大的发明&#xff0c;那么油烟机则是健康厨房的伟大推进者。随着科技的发展&#xff0c;智能化的油烟机逐渐走进了人们的日常生活。每当我们在爆炒、油炸食物的时候&#xff0c;油烟总能呛得人眼睛痛、鼻子难受&#xff0c;传统的油烟机面前我们还需要手动…...

啥?PS一秒成图?Adobe的逆天黑科技大公开

在日前举行的 Adobe MAX 创意大会上&#xff0c;Adobe Adobe Firefly Image 2&#xff08;萤火虫二代成像模型&#xff09;、Firefly Vector Model&#xff08;萤火虫矢量模型&#xff09;和Firefly Design Model&#xff08;萤火虫设计模型&#xff09;。 Firefly矢量模型是世…...

扫描器(xray和bp联动)

文章目录 分类主动扫描和被动扫描bp与xray联动 分类 扫描器分为对web的扫描器和对主机的扫描器 主动扫描和被动扫描 主动扫描&#xff1a; 输入某个URL&#xff0c;然后由扫描器中的爬虫模块爬取所有链接&#xff0c;对GET、POST等请求进行参数变形和污染&#xff0c;进行重放测…...

[C++]:1.初识C++和C语言缺陷补充。

初识C和C语言缺陷补充 一.主要内容&#xff1a;二.具体内容&#xff1a;一&#xff1a; 作用域1.命名空间&#xff1a;2.函数声明和定义&#xff1a;3.不存在命名冲突的情况&#xff1a; 二.输入输出&#xff1a;1.基本输入输出&#xff1a;2.关于std的展开&#xff1a; 三.函数…...

BUUCTF学习(三): PHP 代码审计

1、介绍 2、解题 (1)查看网页源代码 (2)返回链接 (3)代码审计...

推荐《Blue prison》

电视动画片《蓝色监狱》改编自金城宗幸原作、野村优介作画的同名漫画作品&#xff0c;于2021年7月31日宣布电视动画化的消息 [1]。该片由8Bit负责动画制作&#xff0c;于2022年10月9日起播出 [2]&#xff0c;全24集。 该作评为Anime Corner 2022年年度体育动画 [24]&#xff0…...

goland安装教程

安装版本&#xff1a; goland-2023.2.3.exe...

java中okhttp和httpclient那个效率高

在比较OkHttp和HttpClient的效率时&#xff0c;需要考虑多个因素&#xff0c;包括性能、吞吐量、资源消耗等。这些因素往往取决于具体的使用场景和需求。 OkHttp是一个由Square开发的现代化HTTP客户端库&#xff0c;它在Android平台上广泛使用&#xff0c;并且也可以在Java应用…...

内存占用问题

虚拟内存介绍 虚拟内存就是将部分磁盘变成内存的拓展&#xff0c;用上去就好像是将内存变大了一样。 比如同样是16G的物理内存&#xff0c;有人能比你多开几个应用&#xff0c;你开两三个就要黑屏&#xff0c;然后浏览器说你内存不够。 打开任务管理器&#xff0c;内存也没有…...

代码随想录二刷 Day 34

455.分发饼干 这个题差不多是两个for循环遍历&#xff0c;然后用双指针法化简&#xff0c;自己可以大概写出来&#xff0c;漏了一个边界条件 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end(…...

软件开源快速开发框架:降本增效,助力流程化办公!

随着时代的进步和社会的发展&#xff0c;应用软件开源快速开发框架的优势特点&#xff0c;可以让不少客户朋友顺利实现流程化办公&#xff0c;朝着数字化方向迈进。流辰信息是专业研发低代码技术平台的服务商&#xff0c;一直在低代码平台领域深耕细作&#xff0c;努力钻研&…...

Flink on k8s容器日志生成原理及与Yarn部署时的日志生成模式对比

Flink on k8s部署日志详解及与Yarn部署时的日志生成模式对比 最近需要将flink由原先部署到Yarn集群切换到kubernetes集群&#xff0c;在切换之后需要熟悉flink on k8s的运行模式。在使用过程中针对日志模块发现&#xff0c;在k8s的容器中&#xff0c;flink的系统日志只有jobma…...