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

C++学习——缺省参数、重载函数、引用

目录

前言

一、缺省参数

1.1概念

1.2写法

1.3半缺省

1.4使用

二、重载函数

2.1.概念

2.2类型

2.3参数

2.4顺序

2.5问题

2.6原理

三、引用

1、引用是什么?

2、引用的使用方法

3、引用特性

1、引用在定义的时候必须要初始化

2、一个变量会有多个引用

3、引用一旦引用了一个实体,就不能再引用别的

4、与指针对比

5、使用场景

5.1引用作参数

5.1.1大对象作为引用参数

5.2引用作为返回值

5.2.1使用

5.2.2引用作为返回值的注意点

5.2.3引用返回用于读写修改

5.2.4权限问题

5.2.5总结

总结


前言

缺省参数的含义很好理解,重载函数是一个很有意思的用法,对比C语言有了很大的改变。

我们之前在C语言中学过指针,一个*对应着一个&,分别是解引用和取地址,那么在C++里也有一个类似的但是它只有一个&,通过这种用法这里就不是取地址的意思了,而是引用的意思,而且比较方便容易使用。


一、缺省参数

1.1概念

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参

1.2写法

void Func(int a = 0)//这就是缺省参数
{cout << a << endl;
}
int main()
{Func();//不传参数的时候用函数自己里面的Func(10);//传的时候用显示参数,用指定的参数return 0;
}

这里就是一个缺省参数的写法,比较简单理解。

1.3半缺省

//-----半缺省,从右往左缺省,传参从左往右
void Func(int a , int b = 15, int c = 20)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}
int main()
{//Func();Func(1);     //1	15	20Func(1,2);   //1	2	20可以从左到右传依次传参Func(1,2,3); //1	2	3return 0;
}

半缺省的实现就是从左往右走,没传入参数的就按照函数内的参数输出。

1.4使用

这里是一个栈。

struct Stack
{int* a;int top;int capacity;
};void StackInit(struct Stack* pst,int defaultCapacity=4)
{pst->a = (int*)malloc(sizeof(int) * defaultCapacity);if (pst->a){perror("malloc fail");return;}pst->top = 0;pst->capacity = 4;
}int main()
{struct Stack st;StackInit(&st,100);StackInit(&st);return 0;
}

如果没有defaultCapacity,那就需要不断扩容,效率低下,但我们不知道要申请多少内存,所以先给4个,不够用再扩容,默认情况下开少一点,如果想控制就显示的传入参数。

这里注意:

声明和定义不能同时给缺省,因为这时候就不知道按照谁的来了

二、重载函数

2.1.概念

我们知道C语言不允许同名函数的出现,c++则可以,自动匹配类型,构成重载需要没有歧义。

函数重载是函数中的一种特殊的情况,C++允许在同一作用域中声明几个功能类似的同名函数。这些同名函数形参列表(参数个数或类型或类型顺序)不同,常用来处理实现功能类似数据类型不同的问题,返回值没有要求

2.2类型

//---类型
int ADD(int left, int right)
{cout << "int ADD(int left,int right)" << endl;return left + right;
}
double ADD(double left, double right)
{cout << "double ADD(double left,double right)" << endl;return left + right;
}
int main()
{cout << ADD(1, 2) << endl;cout << ADD(1.1, 2.2) << endl;return 0;
}

这里返回的类型不同,传入形参的类型也不同,所以可以实现函数重载,不会报错。

2.3参数

//----参数
void Func()
{cout << "Func()" << endl;
}
void Func(int a)
{cout << "Func(int a)" << endl;
}

一个有参数,一个没有参数,所以可以用函数重载,不会报错。

2.4顺序

//----顺序
//也可以认为是类型不同
void f(int a, char b)
{cout << "f(int a, int b)" << endl;
}
void f(char b, int a)
{cout << "f(int a, int b)" << endl;
}

这里是顺序不同,当然也可以认为是类型不同,因为两个形参的类型发生了变化,所以可以用函数重载,不会报错。

2.5问题

当无参调用的时候就会发生歧义

//----问题:无参调用存在歧义
void f()
{cout << "f()" << endl;
}
void f(int a=0)
{cout << "f(int a=0)" << endl;
}
int main()
{f();//重载调用不明确return 0;
}

这里就会出现一个报错,说是重载调用不明确,也就是不知道用哪一个函数了。所以要注意一下。

2.6原理

实际上,函数重载的实现是和它编译器汇编命名规则有关,C语言为什么不能函数重名,因为在C语言中,汇编函数的命名就是函数本身的名字,没有发生改变,所以肯定会发生冲突。而在C++中,汇编函数的命名是重新用一种函数命名的方法,它结合了形参,使两个函数名发生了不同,所以调用的时候不会发生冲突从而实现了函数重载。

三、引用

1、引用是什么?

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

在C++中,引用是一种别名,用于引用已存在的变量或对象。它允许我们通过一个变量名来访问另一个变量的值,而无需使用指针。

引用通常用于函数参数、函数返回类型、以及作为对象的别名。引用在声明时必须进行初始化,一旦初始化后,它将一直引用同一个对象,无法改变引用的目标。引用在使用上类似于原始变量,但是对引用的操作实际上是对原始变量的操作。引用的主要优点是可以避免拷贝大型对象,提高程序的效率。

什么是别名呢,比如你是李白,你又字太白,所以我可以管你叫李白,也可以管你叫“李太白”,但是这两个名字是否是一个人呢?当然如此,就是一个对象,有不同的叫法。

2、引用的使用方法

我们直接给出代码:

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

这里给出了一个变量a,引用b,也就是a的别名可以是b,引用c,b的别名是c,而b又是a的别名,所以c是a的别名,b和c实际上就是a,这里a赋给10,那么输出来的三个变量也都是10。我们不妨可以运行一下:

我们可以看见都是a的地址,他们也都是10,这就是引用。

3、引用特性

引用这里也有几个要注意的特性:

1、引用在定义的时候必须要初始化

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

这里要是不初始化的话就会报错。

2、一个变量会有多个引用

比如我们之前的代码:

    int a = 0;int& b = a;int& c = b;

这里a变量就有两个引用,分别是b和c。

3、引用一旦引用了一个实体,就不能再引用别的

int a = 10;
int& b = a;
int c = 5;
int& b = c;
cout << a << " " << b << " " << c << " " << endl;
return 0;

这里我们b先引用了a,然后又定义了一个c的变量,再把b引用c,这时候如果我们运行程序的话,就会发现报错。

4、与指针对比

我们以前可能写过两个数交换的函数,那时候用的是指针交换:

void swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}
int main()
{int a = 10;int b = 30;cout << "before::" << a << " " << b << endl;swap(&a, &b);cout << "after::" << a << " " << b << endl;return 0;
}

我们通过两个数的指针传入地址实现传址交换通过交换:

这里我们就可以用C++来实现,因为别名都是一个对象的,所以如果引用传入的参数,那么自函数里的参数就是主函数传入参数的别名,都是同一个变量,变相的实现了传址:

void swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}
int main()
{int a = 10;int b = 30;cout << "before::" << a << " " << b << endl;swap(a, b);cout << "after::" << a << " " << b << endl;return 0;
}

这里运行之后还是符合的:

如果这里是传的指针呢?

void swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}
int main()
{int x = 10;int y = 30;int* a = &x;int* b = &y;cout << "before::" << *a << " " << *b << endl;swap(*a, *b);cout << "after::" << *a << " " << *b << endl;return 0;
}

这里就是参数传入的是指针,我们依旧可以用引用来实现:

把指针引用可以吗,当然可以了,请看下面的代码:

void swap(int*& a, int*& b)
{int tmp = *a;*a = *b;*b = tmp;
}
int main()
{int x = 10;int y = 30;int* a = &x;int* b = &y;cout << "before::" << *a << " " << *b << endl;swap(a, b);cout << "after::" << *a << " " << *b << endl;return 0;
}

这里就直接把指针引用了,结果运行后还是之前的:

指针和引用的不同点:

1、引用概念上定义一个变量的别名,指针存储了一个变量地址。

2、引用在定义时必须初始化,指针没有要求

3、引用在初始化时引用了一个实体后,就不能再引用其它实体,而指针可以在任何时候指向任何一个同类型的实体

4、没有NULL引用,但有NULL指针

5、在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台4个字节)

6、引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

7、有多级指针,但是没有多级引用

8、访问实体方式不同,指针需要显示解引用,引用编译器自己处理

9、引用比指针使用起来相对更安全

5、使用场景

5.1引用作参数

引用作为参数就是为了提升效率,针对两种情况最适合用引用来作为参数,第一个是大对象,第二个是深度拷贝对象。深度拷贝是指在拷贝对象时,不仅要复制对象的成员变量的值,还需要为新对象分配独立的内存空间,并将原对象的值复制到新对象的内存空间中。这里先接触大对象,后期再接触深度拷贝。

5.1.1大对象作为引用参数

大对象是什么意思,就是通过sizeof后,比较大的对象。

我们可以用下面的代码进行测试:

struct A { int a[10000]; };
void test1(A a) {}
void test2(A& a){}
void testref()
{A a;//以值作为函数参数size_t begin1 = clock();for (size_t i = 0; i < 10000; ++i)test1(a);size_t end1 = clock();//以引用作为函数参数size_t begin2 = clock();for (size_t i = 0; i < 10000; ++i)test2(a);size_t end2 = clock();//分别计算两个函数运行结束后的时间cout << "test1_time::" << end1 - begin1 << endl;cout << "test2_time::" << end2 - begin2 << endl;
}int main()
{testref();return 0;
}

这里定义了一个结构体,里面有一个四万字节的整形数组,定义了两个函数,一个是单独的传值,一个用了引用,这里我们可以通过time库函数计时来看到明显的区别:

可以看到时间效率的快慢,对象越大,代价越大。

5.2引用作为返回值

5.2.1使用

我们先看这一块代码:

int Func()
{static int n = 0;n++;return n;
}
int main()
{int a=Func();return 0;
}

Func函数内变量n是在静态区的,当函数调用后n++,但这里不是直接n赋给了主函数里的a,而是通过一个中间的一个寄存器或者其他临时变量接收,然后再传给a,函数栈帧也销毁。

这样我们就可以知道,中间的步骤也是需要时间的,如何才能绕过中间的寄存器或者临时变量呢?这里就可以用引用作为返回值。

int& Func()
{static int n = 0;n++;return n;
}
int main()
{int a=Func();return 0;
}

函数返回的是n,这里引用了n,赋给了a,所以返回值n就是a的一个别名,直接跳过了中间的一系列操作。

如果不生成临时变量好处就是减少了拷贝,提高了效率,在面对大对象的时候影响会很大

我们同样可以用time库来测试一下效率:

struct A { int a[10000]; };
A a;
A test1() { return a;}//值返回
A& test2() { return a;}//引用返回
void testref()
{//以值作为函数返回值类型size_t begin1 = clock();for (size_t i = 0; i < 10000; ++i)test1();size_t end1 = clock();//以引用作为函数返回值类型size_t begin2 = clock();for (size_t i = 0; i < 10000; ++i)test2();size_t end2 = clock();//分别计算两个函数运行结束后的时间cout << "test1_time::" << end1 - begin1 << endl;cout << "test2_time::" << end2 - begin2 << endl;
}

这里就是通过值返回和引用返回,运行下来可以看到明显的差距:

5.2.2引用作为返回值的注意点

我们思考一个问题:函数栈帧的创建和销毁应该是在一个作用域内的,如果出了这个作用域,就被系统回收销毁了,那么我们在传值引用的时候会不会出现问题?

答案是有可能会的,而且很不安全,所以一定要谨慎使用,这完全取决于栈帧销不销毁,取决于系统,栈帧不销毁我们就可以用,但如果销毁了我们就只能用传值。

我们在用返回值引用的时候,有以下几种情况可以使用:

1、static静态区变量

2、全局变量

3、malloc内存

5.2.3引用返回用于读写修改

我们定义了一个顺序表,这里用的静态顺序表方便演示:

struct SeqList
{int a[100];size_t size;
};

如果提供一个函数可以对它修改而且还可以获取当前修改的地方,怎么写?

int& SLAt(SeqList& ps, int pos)
{assert(pos < 100 && pos >= 0);return ps.a[pos];
}

通过引用返回就可以实现,这里引用的是当前要修改位置的变量,通过以下操作就可以实现:

int main()
{SeqList s;SLAt(s, 0) = 1;cout << SLAt(s, 0) << endl;SLAt(s, 0) += 5;
}

这里就是表的第0个位置修改成1,第0个位置加上5。

5.2.4权限问题

引用返回也有权限问题,这里先说结论:

引用的过程中,权限不能放大,可以缩小或者平移

//引用的过程中,权限不能放大const int a = 0;int& b = a;

这里原来a是常变量,引用后是一个没有限制的整形,所以权限发生了变大,是不能的。

//	//引用过程中,权限可以平移或者缩小int x = 0;int& y = x;

还有一种就是修改的 方法:

	int& y = x;const int& z = x;//缩小的是z作为别名的权限,x作为别名z的时候不能修改,当为x的时候可以修改,这里可以修改x,y来改变z,但是不能通过z来改变

这里z因为是常量,所以不能进行修改,但是可以通过x来修改,可以通过x和y来修改z的值。

下面这段代码可不可以运行,可以,因为会发生整形提升:

int main()
{double dd = 1.11;int ii = dd;
}

当我们用引用呢?

int main()
{double dd=1.11;int& rii = dd;//const int& rii = dd;
}

答案是不能。也许你会想以你为是因为不同类型的原因,当然这也是一部分原因,但还有另一部分原因,就是在这里不同类型赋值的时候,中间会出现一个临时变量,而这个临时变量是有常性的,所以不能。如果给上一个const就可以实现。

5.2.5总结

1、基本任何场景都可以用引用传参
2、谨慎用引用做返回值,出了函数作用域,对象不在了,就不能用引用返回,还在就可以用引用返回.


总结

今天主要对缺省参数进行了了解,重载函数进行了了解,重点对引用进行了学习。

相关文章:

C++学习——缺省参数、重载函数、引用

目录 前言 一、缺省参数 1.1概念 1.2写法 1.3半缺省 1.4使用 二、重载函数 2.1.概念 2.2类型 2.3参数 2.4顺序 2.5问题 2.6原理 三、引用 1、引用是什么&#xff1f; 2、引用的使用方法 3、引用特性 1、引用在定义的时候必须要初始化 2、一个变量会有多个引用…...

docker-compose 配置nginx

前言 前端打包的dist文件在宿主机&#xff0c;nginx运行在docker-compose 问题 nginx.conf 在本地配置可以生效&#xff0c;但是链接到容器就报错 基于本地的nginx运行&#xff0c;本地nginx.conf 如下 server {listen 8081;location / {root /usr/local/software/testweb/…...

LQB(0)-python-基础知识

一、Python开发环境与基础知识 python解释器&#xff1a;用于解释python代码 方式&#xff1a; 1.直接安装python解释器 2.安装Anaconda管理python环境 python开发环境&#xff1a;用于编写python代码 1.vscode 2.pycharm # 3.安装Anaconda后可以使用网页版的jupyter n…...

【C语言】指针运算与数组关系:详细分析与实例讲解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;1. 指针的基础运算1.1 指针的加减运算1.2 指针加整数与指针减整数1.3 指针与指针的运算 &#x1f4af;2. 指针的实际应用&#xff1a;模拟 strlen 函数2.1 使用指针模拟…...

C++数组

指针&#xff0c;是C数组工作方式的基础。 数组&#xff0c;基本上是元素的集合。按特定的顺序排列的一堆东西。 C数组&#xff0c;就是表示一堆的变量组成的集合。一般是一行相同类型的变量。 例子&#xff1a; #include <iostream> int main() {int example[5];exa…...

OSPF基础(2)

一、LSA的头部 LSA是OSPF的一个核心内容&#xff0c;如果没有LSA&#xff0c;OSPF是无法描述网络的拓扑结构及网段信息的,也无法传递路由信息&#xff0c;更加无法正常工作&#xff0c;在OSPFV2中&#xff0c;需要我们掌握的主要有6种。 LSA头部一共20byte&#xff0c;每个字段…...

DeepSeek R1 简单指南:架构、训练、本地部署和硬件要求

DeepSeek 的 LLM 推理新方法 DeepSeek 推出了一种创新方法&#xff0c;通过强化学习 (RL) 来提高大型语言模型 (LLM) 的推理能力&#xff0c;其最新论文 DeepSeek-R1 对此进行了详细介绍。这项研究代表了我们如何通过纯强化学习来增强 LLM 解决复杂问题的能力&#xff0c;而无…...

javaEE-6.网络原理-http

目录 什么是http? http的工作原理&#xff1a; 抓包工具 fiddler的使用 HTTP请求数据: 1.首行:​编辑 2.请求头(header) 3.空行&#xff1a; 4.正文&#xff08;body&#xff09; HTTP响应数据 1.首行&#xff1a;​编辑 2.响应头 3.空行&#xff1a; 4.响应正文…...

把bootstrap5.3.3整合到wordpress主题中的方法

以下是将 Bootstrap 5.3.3 整合到 WordPress 主题中的方法&#xff1a; 下载 Bootstrap 文件&#xff1a;从 Bootstrap 官网下载最新的 5.3.3 版本的 CSS 和 JavaScript 文件。 上传文件到主题目录&#xff1a;将下载的 CSS 文件上传到 WordPress 主题文件夹中的 /css 文件夹…...

深度整理总结MySQL——Buffer Pool工作原理

Buffer Pool工作原理 前言为什么会有Buffer PoolBuffer Pool介绍Buffer Pool有多大Buffer Pool缓存什么呢Buffer Pool碎片空间查询一条记录&#xff0c;就只需要缓冲一条记录吗 如何管理Buffer Pool如何管理空闲页如何管理脏页如何提高缓存命中率 LRU带来的问题预读失效Buffer …...

langchain教程-9.Retriever/检索器

前言 该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial 我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容 这是教程清单 1.初试langchain2.prompt3.OutputParser/输出解析4.model/vllm模型部署和langchain调用5.DocumentLoader/多种文档…...

凝思60重置密码

凝思系统重置密码 - 赛博狗尾草 - 博客园 问题描述 凝思系统进入单用户模式&#xff0c;在此模式下&#xff0c;用户可以访问修复错误配置的文件。也可以在此模式下安装显卡驱动&#xff0c;解决和已加载驱动的冲突问题。 适用范围 linx-6.0.60 linx-6.0.80 linx-6.0.100…...

指针基础知识1

1.内存和地址 1.案例 我们可以借助一个生活在的案例来熟悉电脑中内存和地址的关系&#xff1a; 假设有⼀栋宿舍楼&#xff0c;把你放在楼里&#xff0c;楼上有100个房间&#xff0c;但是房间没有编号&#xff0c;你的⼀个朋友来找你玩&#xff0c; 如果想找到你&#xff0c;…...

大数据学习之Spark分布式计算框架RDD、内核进阶

一.RDD 28.RDD_为什么需要RDD 29.RDD_定义 30.RDD_五大特性总述 31.RDD_五大特性1 32.RDD_五大特性2 33.RDD_五大特性3 34.RDD_五大特性4 35.RDD_五大特性5 36.RDD_五大特性总结 37.RDD_创建概述 38.RDD_并行化创建 演示代码&#xff1a; // 获取当前 RDD 的分区数 Since ( …...

Windows本地部署DeepSeek-R1大模型并使用web界面远程交互

文章目录 前言1. 安装Ollama2. 安装DeepSeek-r1模型3. 安装图形化界面3.1 Windows系统安装Docker3.2 Docker部署Open WebUI3.3 添加Deepseek模型 4. 安装内网穿透工具5. 配置固定公网地址 前言 最近爆火的国产AI大模型Deepseek详细大家都不陌生&#xff0c;不过除了在手机上安…...

【Linux系统】线程:线程控制

一、POSIX线程库 与线程有关的函数构成了一个完整的系列&#xff0c;绝大多数函数的名字都是以“pthread_”打头的。使用这些函数库&#xff0c;要通过引入头文件 <pthread.h>。链接这些线程函数库时要使用编译器命令的 -lpthread 选项。 二、轻量级进程创建&#xff1a…...

GoFrame 微服务开发指南

基本介绍 GoFrame 框架支持微服务模式开发&#xff0c;提供了常用的微服务组件、开发工具、开发教程帮助团队快速微服务转型。 微服务组件简介 GoFrame 微服务组件具有低耦合及通用化设计&#xff0c;组件化使用支持大部分的微服务通信协议。在官方文档中&#xff0c;主要以…...

Python-基于PyQt5,Pillow,pathilb,imageio,moviepy,sys的GIF(动图)制作工具(进阶版)

前言&#xff1a;在抖音&#xff0c;快手等社交平台上&#xff0c;我们常常见到各种各样的GIF动画。在各大评论区里面&#xff0c;GIF图片以其短小精悍、生动有趣的特点&#xff0c;被广泛用于分享各种有趣的场景、搞笑的瞬间、精彩的动作等&#xff0c;能够快速吸引我们的注意…...

PhpStorm下载、安装、配置教程

前面的文章中&#xff0c;都是把.php文件放在WampServer的www目录下&#xff0c;通过浏览器访问运行。这篇文章就简单介绍一下PhpStorm这个php集成开发工具的使用。 目录 下载PhpStorm 安装PhpStorm 配置PhpStorm 修改个性化设置 修改字符编码 配置php的安装路径 使用Ph…...

春节假期旅游热潮下,景区医疗安全如何全面升级?

春节假期旅游热潮下&#xff0c;景区医疗安全如何全面升级&#xff1f; 随着旅游业的不断繁荣&#xff0c;春节假期期间&#xff0c;各大景区再次迎来了游客的高峰期。面对如此庞大的客流量&#xff0c;景区不仅要在服务接待上下功夫&#xff0c;更要将医疗安全保障工作提升到…...

惠普HP工作站如何关闭关闭RAID?

惠普HP工作站如何关闭关闭RAID&#xff1f; 前言进入BIOS进入“先进”选项卡&#xff0c;点击“系统选项”。取消勾选“sSATA控制器RAID模式”&#xff0c;按下F10保存重启。 前言 惠普工作站默认启用了RAID模式&#xff0c;导致许多PE工具无法识别RAID模式下的硬盘。可以通过…...

ESP-Skainet智能语音助手,ESP32-S3物联网方案,设备高效语音交互

在科技飞速发展的今天&#xff0c;智能语音助手正逐渐渗透到我们生活的方方面面&#xff0c;而智能语音助手凭借其卓越的技术优势&#xff0c;成为了智能生活领域的一颗璀璨明星。 ESP-Skainet智能语音助手的强大之处在于其支持唤醒词引擎&#xff08;WakeNet&#xff09;、离…...

mac下生成.icns图标

笔记原因&#xff1a; 今日需要在mac下开发涉及图标文件的使用及icons文件的生成&#xff0c;所以记录一下。 网络上都是一堆命令行需要打印太麻烦了&#xff0c;写一个一键脚本。 步骤一 将需要生成的png格式文件重命名为“pic.png” mv xxxx.png pic.png 步骤二 下载我…...

【MySQL】centos 7 忘记数据库密码

vim /etc/my.cnf文件&#xff1b; 在[mysqld]后添加skip-grant-tables&#xff08;登录时跳过权限检查&#xff09; 重启MySQL服务&#xff1a;sudo systemctl restart mysqld 登录mysql&#xff0c;输入mysql –uroot –p&#xff1b;直接回车&#xff08;Enter&#xff09; 输…...

【kafka的零拷贝原理】

kafka的零拷贝原理 一、零拷贝技术概述二、Kafka中的零拷贝原理三、零拷贝技术的优势四、零拷贝技术的实现细节五、注意事项一、零拷贝技术概述 零拷贝(Zero-Copy)是一种减少数据拷贝次数,提高数据传输效率的技术。 在传统的数据传输过程中,数据需要在用户态和内核态之间…...

【JavaEE】Spring Web MVC

目录 一、Spring Web MVC简介 1.1 MVC简介1.2 Spring MVC1.3 RequestMapping注解1.3.1 使用1.3.2 RequestMapping的请求设置 1.3.2.1 方法11.3.2.2 方法2 二、Postman介绍 2.1 创建请求2.2 界面如下&#xff1a;2.3 传参介绍 一、Spring Web MVC简介 官方文档介绍&#xff…...

《解锁GANs黑科技:打造影视游戏的逼真3D模型》

在游戏与影视制作领域&#xff0c;逼真的3D模型是构建沉浸式虚拟世界的关键要素。从游戏中栩栩如生的角色形象&#xff0c;到影视里震撼人心的宏大场景&#xff0c;高品质3D模型的重要性不言而喻。随着人工智能技术的飞速发展&#xff0c;生成对抗网络&#xff08;GANs&#xf…...

【大数据技术】词频统计样例(hadoop+mapreduce+yarn)

词频统计(hadoop+mapreduce+yarn) 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell) 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) 在阅读本文前,请确保已经阅读过以上两篇文章,成功搭建了Hadoop+MapReduce+Yarn的大数据集群环境。 写在前面 Wo…...

deepseek与openai关系

‌DeepSeek与OpenAI之间的关系主要体现在技术竞争和合作的可能性上。‌ 首先&#xff0c;DeepSeek是由中国的深度求索公司开发的&#xff0c;成立于2023年&#xff0c;专注于人工智能技术研发。其大模型DeepSeek-R1在数学、代码、自然语言推理等任务上的性能能够比肩OpenAI的G…...

51页精品PPT | 数据中台与数据治理服务及案例

案例的核心内容围绕数据中台与数据治理服务展开&#xff0c;详细介绍了数据治理的整体方法论、数据中台的建设路径以及如何通过数据治理和数据中台提升业务效率和数据质量。本案例强调了数据治理的重要性&#xff0c;包括数据标准、数据质量、数据安全等方面的管理&#xff0c;…...

使用 cipher /w 清除磁盘删除残留数据(Windows) - 随笔

cipher命令是Windows 系统自带的一个用于管理文件加密和磁盘数据清除的工具。通过 cipher /w 命令&#xff0c;可以清除磁盘上已删除文件的残留数据&#xff0c;确保这些数据无法被恢复。以下是一个简易的批处理脚本&#xff0c;用于清除指定磁盘上的加密数据。 echo off :: 清…...

RuntimeWarning: invalid value encountered in sqrt

代码出处&#xff1a; GitHub - wangsen1312/joints2smpl: fit smpl parameters model using 3D joints RuntimeWarning: invalid value encountered in sqrt 你可以通过以下几种方式解决这个问题&#xff1a; 1. 检查负值或零行列式 确保协方差矩阵是正半定的&#xff0c;这…...

3步打造C# API安全密盾

引言&#xff1a;API 安全的重要性 在数字化浪潮中&#xff0c;应用程序编程接口&#xff08;API&#xff09;已成为不同软件系统之间通信和数据交互的关键桥梁。无论是企业内部的微服务架构&#xff0c;还是面向外部用户的在线服务&#xff0c;API 都承担着数据传输和业务逻辑…...

项目实操:windows批处理拉取git库和处理目录、文件

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

接入 deepseek 实现AI智能问诊

1. 准备工作 注册 DeepSeek 账号 前往 DeepSeek 官网 注册账号并获取 API Key。 创建 UniApp 项目 使用 HBuilderX 创建一个新的 UniApp 项目&#xff08;选择 Vue3 或 Vue2 模板&#xff09;。 安装依赖 如果需要在 UniApp 中使用 HTTP 请求&#xff0c;推荐使用 uni.requ…...

ubuntu22.04源码编译mysql8.0.X详细流程【由deepseek提供】

以下是在 Ubuntu 22.04 上从源代码编译安装 MySQL 8.0.X&#xff08;以 MySQL 8.0.37 为例&#xff09;的详细操作流程&#xff1a; 一、准备工作 1. 更新系统 sudo apt update && sudo apt upgrade -y sudo apt install -y build-essential cmake pkg-config libssl…...

富唯智能复合机器人拓展工业新维度

富唯智能复合机器人是富唯智能倾力打造的一款集高度自动化、智能化和多功能性于一体的机器人。它融合了机械、电子、计算机、传感器等多个领域的前沿技术&#xff0c;通过精密的算法和控制系统&#xff0c;实现了对复杂生产环境的快速适应和高效作业。 富唯智能复合机器人的特点…...

【2】高并发导出场景下,服务器性能瓶颈优化方案-异步导出

Java 异步导出是一种在处理大量数据或复杂任务时优化性能和用户体验的重要技术。 1. 异步导出的优势 异步导出是指将导出操作从主线程中分离出来&#xff0c;通过后台线程或异步任务完成数据处理和文件生成。这种方式可以显著减少用户等待时间&#xff0c;避免系统阻塞&#x…...

verdi 查看覆盖率

点击Tools -> Coverage&#xff0c;会出现一个Verdi:vdCoverage:1页面点击File->Open/Add Database, 会出现一个 Open/Add Coverage Database页面&#xff0c; 在Design Hierarchy/Testbench Location 中输入 vdb路径点击… &#xff0c; 会出现当前路径下的文件&#xf…...

【React】路由处理的常见坑与解决方法,React Router 的动态路由与懒加载问题

在使用 React Router 时,动态路由和懒加载是非常常见的需求,但也可能会遇到一些坑。以下是常见问题以及对应的解决方法。 一、React Router 动态路由常见问题 1. 动态路由匹配问题 动态路由通常通过 :param 定义路径参数,但如果路径参数与静态路由有重叠,可能会导致匹配问…...

OKHttp拦截器解析

OKHttp涉及到拦截器大概的执行步骤为&#xff1a; 1.通过newCall生成RealCall对象 具体代码如下&#xff1a; Override public Call newCall(Request request) {return new RealCall(this, request, false /* for web socket */);}2.调用Call的execute方法 当然这也可以是执…...

顺序表和链表

线性表 线性表&#xff08;linear list&#xff09;是n 个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构。 常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。但是在物…...

若依框架使用(低级)

克隆源码 浏览器搜索若依&#xff0c;选择 RuoYi-Vue RuoYi-Vue RuoYi-Vue 重要的事情说三遍&#xff0c;进入gitee 下面这个页面&#xff08;注意红色框起来的部分&#xff09; 进入Gitee进行下载 我下载的是最新的springboot3 下载好后我们可以选择一个文件夹&#xff0…...

Spring JDBC模块解析 -深入SqlParameterSource

在前面的博客中&#xff0c;我们探讨了Spring Data Access Module中的主要组件&#xff1a; JdbcTemplate和SimpleJdbcInsert。在这两部分的基础上&#xff0c;我们将继续探讨更详细 的用法&#xff0c;包括如何使用RowMapper和SqlParameterSource等高级主题。 JdbcTemplate …...

SQL中Limit的用法详解

SQL中的LIMIT关键字是一个非常有用的工具&#xff0c;它可以用来限制查询结果返回的记录数量。文章将详细解析LIMIT关键字的使用方法&#xff0c;包括它的基本用法&#xff0c;以及在查询数据时如何配合使用LIMIT与OFFSET。我会通过示例代码演示LIMIT在单行结果集和多行结果集情…...

mac 安装 dotnet 环境

目录 一、安装准备 二、安装方法&#xff08;两种任选&#xff09; 方法 1&#xff1a;使用官方安装包&#xff08;推荐新手&#xff09; 方法 2&#xff1a;使用 Homebrew&#xff08;适合开发者&#xff09; 1. 安装 Homebrew&#xff08;如未安装&#xff09; 2. 通过 …...

DeepSeek辅助学术写作【句子重写】效果如何?

句子重写(功能指数:★★★★★) 当我们想引用一篇文章中的一-些我们认为写得很好的句子时&#xff0c;如果直接将原文加人自己的文章&#xff0c;那么即使我们标注上了引用&#xff0c;也依旧会被查重软件计算在重复比例中。查重比例过高的话&#xff0c;会影响投稿或毕业答辩送…...

SpringUI Web高端动态交互元件库

Axure Web高端动态交互元件库是一个专为Web设计与开发领域设计的高质量资源集合&#xff0c;旨在加速原型设计和开发流程。以下是关于这个元件库的详细介绍&#xff1a; 一、概述 Axure Web高端动态交互元件库是一个集成了多种预制、高质量交互组件的工具集合。这些组件经过精…...

QT +FFMPEG4.3 拉取 RTMP/http-flv 流播放 AVFrame转Qimage

QT FFMPEG4.3 拉取 RTMP/http-flv 流播放 Cc_Video_thread.h #ifndef CC_VIDEO_THREAD_H #define CC_VIDEO_THREAD_H#include <QThread> #include <QAtomicInt> #include <QImage>#ifdef __cplusplus extern "C" { #endif #include <libavfor…...

Docker最佳实践:安装Nacos

文章目录 Docker最佳实践&#xff1a;安装Nacos一、引言二、安装 Nacos1、拉取 Nacos Docker 镜像2、启动 Nacos 容器 三、配置 Nacos&#xff08;可选&#xff09;四、使用示例1、服务注册2、服务发现 五、总结 Docker最佳实践&#xff1a;安装Nacos 一、引言 Nacos 是阿里巴…...