【C++深入浅出】初识C++中篇(引用、内联函数)

这篇具有很好参考价值的文章主要介绍了【C++深入浅出】初识C++中篇(引用、内联函数)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数


 

目录

一. 前言

二. 引用

2.1 引用的概念

2.2 引用的使用

2.3 引用的特性

2.4 常引用

2.5 引用的使用场景

2.6 传值、传引用效率比较

2.7 引用和指针的区别

 三. 内联函数

3.1 内联函数的概念

3.2 内联函数的特性 


一. 前言

        上期说道,C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。我们介绍了部分C++为了补充C语言语法上的不足而新增的内容,如命名空间,缺省参数,函数重载等等,上期传送门【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数【C++深入浅出】初识C++(上篇)http://t.csdn.cn/UjbIo        本期将继续介绍C++剩下的一些有趣的功能,如引用内联函数等等,这也是为了后面的类和对象打好基础。【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数 

          话不多说,直接上菜!!!

二. 引用

2.1 引用的概念

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

        引用就相当于我们给别人起昵称。例如你叫你女朋友小笨猪,那么对你而言,小笨猪就是你的女朋友,和叫名字是一个意思,既不是其他任何人,你也不会因此多一个女朋友【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

2.2 引用的使用

        类型& 引用变量名(对象名) = 引用实体

void Test()
{
	int a = 10;
	int& ra = a; //<====定义引用类型,此时ra就是变量a的别名,ra与a是同一块内存空间
	printf("a的地址为%p\n", &a);
	printf("ra的地址为%p\n", &ra);
}

int main()
{
	Test();
	return 0;
}

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

我们看到变量a和引用变量ra的地址是一样的,说明它们共用同一块内存空间。【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

 2.3 引用的特性

        使用引用时需要注意以下几点特性【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

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

int main()
{
	int a = 10;
	int& b; //错误写法,会报错
	int& b=a; //正确写法
	return 0;
}

         2、一个变量可以有多个引用

int main()
{
	int a = 10;
	//下面的b,c,d均是变量a的别名
	int& b = a;
	int& c = a;
	int& d = c;
	printf("%p %p %p %p\n", &a,&b,&c,&d);
	return 0;
}

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

          3、引用一旦引用一个实体,就不能引用其他实体

int main()
{
	int a = 10;
	int& b = a; //b是a的别名
	int c = 20; 

	//能不能将b改成c的别名呢?
	b = c; //不行,这条语句是将c的值赋给引用变量b,即修改变量a的值,并不是让b引用c

	printf("&a = %p &b = %p &c = %p\n", &a,&b,&c);
	printf("a = %d b = %d c = %d\n", a, b, c);
	return 0;
}

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

          4、引用类型必须和引用实体是同种类型的

int main()
{
	int a = 10;
	double& b = a; //这种写法会报错
	return 0;
}

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

        我们看到编译器报错说非常量限定,那如果我们加上const修饰呢?如下:

    const double& b = a;

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

        我们惊讶地发现通过了编译,说明上面不是因为int和double类型不一样而报错,那究竟是为什么呢?下面我们来分析分析【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

         实际上,由于引用实体和引用变量的类型不同,编译器会自动进行隐式类型转换。编译器会生成一个double类型的临时变量tmp,然后将a的内容以某种形式放到临时变量tmp中,最后再让b引用临时变量tmp

int main()
{
	int a = 10;
	const double& b = a;

	//类似于下面的步骤
	int a = 10;
	double tmp = a; //将a的值转换赋给tmp
	const double& b = tmp; //b再引用tmp
	return 0;
}

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

         由于临时变量具有常属性,因此tmp的类型就是const double,用double类型的引用变量引用const double类型的变量,这无疑是一种权限的放大,是不被允许的。就好比别人大门紧缩不然你进,你偏偏另辟蹊径从窗户翻入,这无疑是犯法的,私闯民宅【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数。这就是为什么编译器会报出非常量限定的错误的原因,引用变量d需要加上const修饰,权限的平移是被允许的。

        最后,本来临时变量tmp在当前语句结束后就会被销毁,但此时被b所引用,其生命周期就自动被延长了

         分析了这么多,下面我们用代码来进行验证一下:

int main()
{
	int a = 10;
	const double& b = a;

	printf("&a = %p , &b = %p\n", &a, &b); //求a,b空间的地址

	printf("修改前 a = %d , b = %.2lf\n", a, b);
	a = 20;
    //b = 30; //这句代码会报错,被const修饰的变量不可修改
	printf("修改后 a = %d , b = %.2lf\n", a, b);
	return 0;
}

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

我们发现a的地址和b的地址不同,这说明了b并不是变量a的引用,而是引用了新形成的临时变量。并且,当我们对a进行修改时,b中的内容并没有发生改变,这也印证了a和b不是同一块内存空间。最后,当我们想要对b的内容进行修改时,编译器会直接报错,说明b所在的空间具有常属性


2.4 常引用

        被const关键字修饰的引用变量我们称为常引用。我们无法通过常引用来修改引用实体的值,如下:

#include<iostream>
using namespace std;
int main()
{
	int a = 10;
	const int& b = a;
	//b++; //会报错,b是常引用,无法修改
	a++; //a是普通变量,允许修改
	cout << "a = " << a <<' ' << "b = " << b;
	return 0;
}

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

        前面我们提到了权限不能放大,也就是说:普通引用不能引用常属性变量。但是,权限允许平移或者缩小,即常引用可以引用常属性变量常引用可以引用普通变量。如下:

#include<iostream>
using namespace std;
int main()
{
	int a = 10;
	const int& b = a; //权限的缩小,const引用引用普通变量,编译正常

	const int aa = 10;
	const int& bb = aa;//权限的缩小,const引用引用const变量,编译正常
	int& cc = aa;//权限的放大,普通引用引用const变量,报错

	return 0;
}

 2.5 引用的使用场景

        引用的使用场景一般有两个:做函数参数做函数返回值

        1、引用作为函数参数

        C语言中,如果我们调用函数时使用传值调用,那么形参的改变是不会影响实参的,形参是实参的临时拷贝。如果我们想在函数中对实参进行修改,那就必须使用传址调用,通过地址对实参的值进行修改。

        而在C++中,新增了引用的语法,我们可以使用引用作为函数的形参,此时形参就是实参的一个别名,并不会额外开辟空间,形参和实参共同内存空间,修改形参也就是对实参进行修改。具体实现方式如下【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

#include<iostream>
using namespace std;
void ModifyFun(int& x) //引用作为函数参数
{
	x = 100;
}
int main()
{
	int a = 10;
	cout << "调用前" << a << endl;
	ModifyFun(a);
	cout << "调用后" << a << endl;
}

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数


#include<iostream>
using namespace std;
void Swap(int& x , int& y) //引用作为函数参数
{
	int tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 10;
	int b = 20;
	cout << "交换前:" << "a = " << a << " b = " << b << endl;
	Swap(a, b);
	cout << "交换后:" << "a = " << a << " b = " << b << endl;
}

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

        2、引用作为函数返回值

        引用也可以作为函数的返回值,如下:

#include<iostream>
using namespace std;
int& Count()
{
	static int n = 0; //n是一个静态变量,函数调用结束后不会销毁
	cout << n << endl;;
	return n;
}
int main()
{
	int& k = Count();
	k++;
	Count();
	return 0;
}

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

在Count()函数通过引用返回n,此时main函数中的引用变量k就是n的别名,当我们在main函数中修改k,就相当于对静态变量n做修改。

        但是,如果以下情况使用引用返回会出现什么情况呢? 

int& Add(int a, int b)
{
	int c = a + b; //c是局部变量,Add调用结束后被销毁
	return c;
}
int main()
{
	int& ret = Add(1, 2);
	Add(3, 4);
	cout << "Add(1, 2) is :" << ret << endl;
	return 0;
}

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

 很惊讶的发现,最终ret变量的值不是3而是7,为什么呢?【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

 这就要来谈谈上述代码出现的野引用问题了。

我们通过下图来进行分析【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数 

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

 总结:函数返回时,如果出了函数作用域,返回对象还在(还没销毁还给系统),则可以使用
引用返回;如果已经还给系统了,则必须使用传值返回。

2.6 传值、传引用效率比较

        在C/C++中,以值作为参数或者返回值类型,在传参和返回期间,函数并不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时拷贝,因此用值作为参数或者返回值类型,需要额外进行拷贝,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。

        而如果以引用作为参数或者返回值类型,由于引用是作为变量的别名,并不会额外开辟空间形成拷贝。因此在传参和返回期间,就相当于直接传递实参或将变量本身直接返回,效率大大提升。下面我们通过代码来更直观地看看二者的效率差距:

        值和引用作为函数参数的效率差距

#include <time.h>
struct A { int a[10000]; };
void TestFunc1(A a)
{
	;
}
void TestFunc2(A& a)
{
	;
}
void TestRefAndValue()
{
	A a;
	// 以值作为函数参数
	size_t begin1 = clock(); //clock()函数返回程序运行到调用clock()函数所耗费的时间,单位是ms
	for (size_t i = 0; i < 100000; ++i)
		TestFunc1(a);
	size_t end1 = clock();

	// 以引用作为函数参数
	size_t begin2 = clock();
	for (size_t i = 0; i < 100000; ++i)
		TestFunc2(a);
	size_t end2 = clock();

	// 分别计算两个函数运行结束后的时间
	cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;
	cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
}
int main()
{
	TestRefAndValue();
	return 0;
}

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数


         值和引用作为返回值类型的效率差距

#include <time.h>
struct A 
{
	int a[10000]; 
}a;
// 值返回
A TestFunc1() 
{ 
	return a; 
}
// 引用返回
A& TestFunc2() 
{ 
	return a; 
}
void TestRefAndValue()
{
	// 以值作为函数的返回值类型
	size_t begin1 = clock();
	for (size_t i = 0; i < 100000; ++i)
		TestFunc1();
	size_t end1 = clock();

	// 以引用作为函数的返回值类型
	size_t begin2 = clock();
	for (size_t i = 0; i < 100000; ++i)
		TestFunc2();
	size_t end2 = clock();

	// 计算两个函数运算完成之后的时间
	cout << "TestFunc1 time:" << end1 - begin1 << endl;
	cout << "TestFunc2 time:" << end2 - begin2 << endl;
}
int main()
{
	TestRefAndValue();
	return 0;
}

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

通过上述代码的比较,我们发现传值和引用在作为传参以及返回值类型上效率相差很大。传引用的效率远高于传值。因此能使用引用就尽量使用引用,提高效率。

2.7 引用和指针的区别

        在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

        但在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。这点我们可以参照二者编译后生成的汇编代码证明【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

int main()
{
	//引用
	int a = 10;
	int& ra = a;
	//指针
	ra = 20;
	int* pa = &a;
	*pa = 20;
	return 0;
}

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

可见,引用和指针的汇编代码是一模一样的,最后都是通过变量a的地址来修改a。


不过,引用和指针还是有不同点的,如下:

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用在定义时必须初始化,指针没有要求
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
  4. 引用必须初始化,故没有NULL引用,但有NULL指针
  5. sizeof的含义不同,sizeof(引用变量)的结果为引用实体的类型大小,而sizeof(指针)始终是地址空间所占字节个数(32位平台下占4个字节,64位平台下占8个字节)
  6. 引用自增即引用的实体增加1,指针自增即指针向后偏移一个类型的大小
  7. 多级指针,但是没有多级引用
  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  9. 安全性的角度,引用比指针使用起来相对更安全

三. 内联函数

3.1 内联函数的概念

        以inline关键字修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,不会调用函数建立栈帧,因此内联函数提升程序运行的效率。
        我们可以通过汇编代码来验证加上inline的函数是否会被调用【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

        没加inline关键字:

int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int ans = 0;
	ans = Add(1, 2);
	return 0;
}

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

          加上inline关键字:

inline int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int ans = 0;
	ans = Add(1, 2);
	return 0;
}

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

可以看到,内联函数并不会生成对应的call指令,而是直接被替换到函数调用处,减少了调用函数建立栈帧的开销。

          注意事项:

          内联函数的效果需要在release模式才会体现。因为在debug模式下编译器默认不会对代码进行优化,顾不会进行展开。当然我们也可以进行设置,方法如下(VS2022):

1、找到当前项目属性设置页:

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

 2、设置调试信息格式:

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

  3、设置内联函数扩展:

【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数


3.2 内联函数的特性 

主要有如下几点特性:

  1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用。缺陷:可能会使目标文件变大;优势:少了调用建立栈帧开销,提高程序运行效率。
  2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建
    议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性(编译器也是很聪明的,可不要贪杯噢【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数)。以下为《C++prime》第五版关于inline的描述:【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数
  3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,符号表中就没有函数地址了,链接就会找不到。
    // in.h
    #include <iostream>
    using namespace std;
    inline void f(int i);
    
    // in.cpp
    #include "in.h"
    void fun(int i)
    {
        cout << i << endl;
    }
    
    // main.cpp
    #include "in.h"
    int main()
    {
        fun(10);
        return 0;
    }

    【C++深入浅出】初识C++中篇(引用、内联函数),C++深入浅出,c++,开发语言,笔记,引用,内联函数

    报错原因:由于in.h文件中只有函数的声明没有定义,顾在编译阶段main.cpp中的fun() 函数无法进行展开,只能在链接阶段进行链接。但是由于in.cpp的fun()函数被声明为内联函数,fun()函数并不会进入符号表,最后就会导致链接时找不到函数地址,报错。


以上,就是本期的全部内容啦🌸

制作不易,能否点个赞再走呢🙏文章来源地址https://www.toymoban.com/news/detail-659339.html

到了这里,关于【C++深入浅出】初识C++中篇(引用、内联函数)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ 命名空间、域、缺省参数、函数重载、引用、auto、内联函数的知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

            从本章开始我们正式进入到C++的内容,对此如果没有学习过C语言的建议先将C语言系统的学习一遍后再来(已经更新完在专栏就能看到)。 话不多说安全带系好,发车啦 (建议电脑观看) 。 附:红色,部分为重点部分;蓝颜色为需要记忆的部分(不是死记硬背哈,

    2023年04月24日
    浏览(98)
  • 深入浅出C语言—【函数】下

    函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。 注意: 函数可以嵌套调用,但是不能嵌套定义。 把一个函数的返回值作为另外一个函数的参数。 上面的strlen函数是求数组长度的库函数, 特别注意的是,当数组为字符数组时,数组的末尾会自动放一个

    2024年02月17日
    浏览(76)
  • 深入浅出C语言—【函数】上

       目录 1.函数的概念 2.C语言函数的分类 2.1 库函数 2.1.1 strcpy库函数举例学习方式 2.1.2 库函数扩展知识 2.2 自定义函数 2.2.1求两个整数中的较大值 3. 函数的参数 3.1 实际参数(实参) 3.2 形式参数(形参) 4. 函数的调用 4.1 传值调用 4.2 传址调用 老铁们,网址自取,记得一键

    2024年02月07日
    浏览(70)
  • 深入浅出C++ ——线程库

      在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了 原子类 的概念。要使用标准库中

    2024年02月03日
    浏览(63)
  • 深入浅出C++——C++的类型转换

    在C语言中,如果 赋值运算符左右两侧类型不同 ,或者形参与实参类型不匹配,或者 返回值类型与接收返回值类型不一致 时,就需要发生类型转化。 C语言中总共有两种形式的类型转换: 隐式类型转换:编译器在编译阶段自动进行转换,不能转就编译失败。 显式类型转换:

    2024年02月07日
    浏览(50)
  • 深入浅出Pytorch函数——torch.max

    分类目录:《深入浅出Pytorch函数》总目录 相关文章: · 深入浅出Pytorch函数——torch.max · 深入浅出Pytorch函数——torch.maximum torch.max 有三种输入形式,根据其输入形式及参数的不同有下列三种返回形式: torch.max(input) :返回输入张量所有元素的最大值。 torch.max(input, dim, keep

    2024年02月15日
    浏览(52)
  • 深入浅出Pytorch函数——torch.tensor

    分类目录:《深入浅出Pytorch函数》总目录 相关文章: · 深入浅出TensorFlow2函数——tf.constant · 深入浅出Pytorch函数——torch.tensor · 深入浅出Pytorch函数——torch.as_tensor · 深入浅出Pytorch函数——torch.Tensor · 深入浅出PaddlePaddle函数——paddle.to_tensor 基于 data 构建一个没有梯度历史

    2024年02月04日
    浏览(106)
  • 深入浅出Pytorch函数——torch.exp

    分类目录:《深入浅出Pytorch函数》总目录 相关文章: · 深入浅出TensorFlow2函数——tf.exp · 深入浅出TensorFlow2函数——tf.math.exp · 深入浅出Pytorch函数——torch.exp · 深入浅出PaddlePaddle函数——paddle.exp 对输入 input 逐元素进行以自然数 e e e 为底指数运算。 语法 参数 input :[ Te

    2024年02月11日
    浏览(51)
  • 深入浅出Pytorch函数——torch.squeeze

    分类目录:《深入浅出Pytorch函数》总目录 相关文章: · 深入浅出Pytorch函数——torch.squeeze · 深入浅出Pytorch函数——torch.unsqueeze 将输入张量形状为1的维度去除并返回。比如输入向量的形状为 A × 1 × B × 1 × C × 1 × D Atimes1times Btimes1times Ctimes1times D A × 1 × B × 1 × C × 1 ×

    2024年02月16日
    浏览(51)
  • 深入浅出Pytorch函数——torch.maximum

    分类目录:《深入浅出Pytorch函数》总目录 相关文章: · 深入浅出Pytorch函数——torch.max · 深入浅出Pytorch函数——torch.maximum 计算 input 和 other 的元素最大值。 语法 参数 input :[ Tensor ] 输入张量 other :[ Tensor ] 输入的第二个张量 实例

    2024年02月15日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包