一文搞定移动语义和完美转发

浅拷贝和深拷贝

简单的区分: 浅拷贝:按字节拷贝,如果是指针变量则直接对指针地址进行拷贝 深拷贝:对内容进行拷贝,如果有指针变量则另外申请地址拷贝所指内容

写c++类时,如果类中有指针成员的话,通常我们都会格外注意,要注意拷贝构造函数的编写,因为如果简单的浅拷贝可能导致free一块未定义区域,是非法的。

如下面的程序:

#include<iostream>
using namespace std;
class HasPtrMem
{
public:HasPtrMem() :p(new int(0)) {}HasPtrMem(const HasPtrMem& h) :p(h.p) {}~HasPtrMem() { delete p; }int* p;
};int main()
{HasPtrMem a;HasPtrMem b(a);cout << *a.p << endl;cout << *b.p << endl;
}

构造函数申请了一块堆空间,而析构函数对该空间进行释放。在拷贝构造函数中,执行了浅拷贝,这会引发一个非常严重的问题:a的p申请了一块区域,对b执行了拷贝构造,则b的p指向了同一块区域,因此当程序执行结束时,a和b将纷纷执行其析构函数,假设a先执行其析构函数,则a将所指的区域进行了释放,那么释放后b的指针所指向的区域就成为了非法内存区域,即成为了dangling pointer 悬挂指针,对悬挂指针执行free释放内存将导致严重错误。

因此,通常我们会采用深拷贝的方法解决该问题:

#include<iostream>
using namespace std;
class HasPtrMem
{
public:int* p;HasPtrMem() :p(new int(0)) {}HasPtrMem(const HasPtrMem& h) :p(new int(*h.p)){}  //将拷贝构造函数改成深拷贝,重新申请一块堆上的内存,然后用h.p进行初始化~HasPtrMem() { delete p; }
};int main()
{HasPtrMem a;HasPtrMem b(a);cout << *a.p << endl;cout << *b.p << endl;
}

通过深拷贝,便可以解决浅拷贝的问题。使用深拷贝时,另外申请了一块区域并通过需要拷贝的对象的内容进行初始化,也就是其实指向的是不同的区域,只是内容相同。

看样子深拷贝完美解决了该问题,但是事实上确实这么完美吗?

移动语义

拷贝构造函数为指针成员进行内容拷贝的做法几乎是完美的,但是有些情况下该方法还是较为繁琐。下面的例子将说明:

#include<iostream>
using namespace std;
static int n_cstr;  //记录初始化次数
static int n_dstr;   //记录析构次数
static int n_cptr;   //记录拷贝构造函数次数
class HasPtrMem
{
public:int* p;HasPtrMem() :p(new int(0)){cout << "construct:" << ++n_cstr << endl;  // 输出construct以及构造的次数,并且将次数+1}HasPtrMem(const HasPtrMem& h) :p(new int(*h.p)){cout << "copy construct:" << ++n_cptr << endl;  //输出copy construct以及拷贝的次数,将次W数+1}~HasPtrMem(){delete p;cout << "destruct:" << ++n_dstr << endl;  //输出destruct并且析构的次数,将次数+1}
};
HasPtrMem gettemp()  //构造一个HasPtrMem并返回
{HasPtrMem a = HasPtrMem();cout << a.p << endl;  //输出a的p所指的地址信息return a;
}
int main()
{HasPtrMem b=gettemp();cout << b.p << endl;  //输出b的p所指的地址信息
}

(Tips:现代编译器有诸多优化的方向,如果让gettemp直接返回一个HasPtMem()的话,编译器将不构造它,直到赋值给b时直接为b构建,此段代码具有普适性)

分析该代码:

gettemp()函数是产生一个HasPtrMem并输出地址后返回,写的是 深拷贝,因此将直接对内容进行拷贝,也就是预期是b的指针是指向另外申请的一块区域。

输出结果:

construct:1
00F54E70
copy construct:1
destruct:1
00F54EA0
destruct:2

说明b执行了一次拷贝构造函数,将内容进行了复制,从两个指针指向的区域不同可以看出是另外申请了一块区域。

仔细想想,这次拷贝真的是有必要的吗?如果只是利用返回值进行一个赋值操作而已,那么拷贝构造函数申请了一个新的区域,将原来的内容拷贝过来,但是之后就会对临时变量的区域进行了析构。那么,如果这个指针指向的堆内存是非常大的,那么这一次的拷贝花销还是比较大的。

既然之后也不会用到a的p所指区域,那么如果能够直接将原来的内存给b,那么就会省去这次拷贝操作,会非常的提高效率。

这便是移动构造函数所做的事情。这个行为称为“移动语义

利用移动构造函数后原程序:

#include<iostream>
using namespace std;
static int n_cstr;  //记录初始化次数
static int n_dstr;   //记录析构次数
static int n_cptr;   //记录拷贝构造函数次数
class HasPtrMem
{
public:int* p;HasPtrMem() :p(new int(0)){cout << "construct:" << ++n_cstr << endl;  // 输出construct以及构造的次数,并且将次数+1}HasPtrMem(const HasPtrMem& h) :p(new int(*h.p)){cout << "copy construct:" << ++n_cptr << endl;  //输出copy construct以及拷贝的次数,将次W数+1}HasPtrMem(HasPtrMem&& h) :p(h.p) {h.p = nullptr; cout << "Move construct" << endl; }~HasPtrMem(){delete p;cout << "destruct:" << ++n_dstr << endl;  //输出destruct并且析构的次数,将次数+1}
};
HasPtrMem gettemp()  //构造一个HasPtrMem并返回
{HasPtrMem a = HasPtrMem();*a.p = 10;cout << a.p << endl;  //输出return a;
}
int main()
{HasPtrMem b(gettemp());cout << b.p << endl;  //输出b的p所指的地址信息
}

运行结果:

construct:1
013EC630
Move construct
destruct:1
013EC630
destruct:2

移动构造的输入是一个右值引用(下面会详讲),行为是将h的p直接赋值给了主体的p,然后将h的p赋值为nullptr,这样之后h调用析构函数时也将不去释放任何内存,从而实现了一个内容的“窃取”。 需要注意的是一定要将原来的指针赋为空,否则原来的对象析构时将导致现在的指针悬挂。

分析结果需要注意两个p的地址是相同的,因此是符合预期的。相较于直接深拷贝,移动语义省去了申请新内存区域和拷贝内容以及释放一块内存区域。

也就是说,移动语义实现了从一个对象到另一个对象的资源转移的过程!

最基础的内容就是这样,之后将详将右值引用以及关于移动语义完美转发的更多细节。【这一部分还是比较抽象的,挺难】

右值引用

c语言中常说左值、右值。通常,通常认为左值是变量,右值是一个计算式。通常,我们这样区分,可以取地址的、有名字的就是左值,不能取地址、没有名字的就是右值。 例如在 a=b+c 式子中,a就是一个左值,(b+c)就是一个右值。

在C++11中,右值通常是两个概念:将亡值(将要被移动的对象,包括返回右值引用 T&&)的函数返回值、std::move的返回值等 纯右值(一些运算表达式的值、非引用返回的函数返回的临时变量等)

所谓的右值引用,就是必须绑定到右值的引用,通常用 &&获得右值引用,因此,右值引用通常只能绑定到一个将要销毁的对象,因此,可以自由地将一个右值引用的资源移动到另一个资源而不受影响(因为之后不会再对原资源进行任何操作,除了析构释放)

右值引用只是某个对象的另一个名字而已,可以将右值引用绑定到表达式上,但不能将一个右值引用直接绑定到一个左值上

对于返回非引用类型的函数,可以将一个const的左值引用或者一个右值引用绑定到这样的表达式

右值引用只能绑定到临时对象,这意味着所引用的对象将要被销毁并且该对象没有其他用户,因此使用右值引用的代码可以自由接管所引用对象的资源

【常量左值引用是一个万金油!无论左值还是右值,常量还是非常量,都可以进行绑定,因此如果移动构造函数不符合,那么也至少可以执行拷贝构造函数】

  • 常量左值引用:全能类型,常用于拷贝语义
  • 非常量右值引用:用于移动语义和完美转发
void doWork(TYPE&& param) {// ops and expressions using std::move(param)
}

param是左值还是右值?param是一个左值。左值和右值与类型是没有关系的,即int既可以是左值,也可以是右值。区别左值和右值的唯一方法就是其定义,即能否取到地址。在这里,我们明显可以对param进行取地址操作,所以它是一个左值。也就是说,但凡有名字的“右值”,其实都是左值。

move函数

首先需要记住,move函数不move任何东西,它唯一的作用,就是将一个左值强制转换为右值引用,继而就可以通过右值引用使用该值,以用于移动语义。不过,被转化的左值生命期没有因为左右值的变化而发生变化。

需要注意,被转化为右值后的值将不再使用,通常转换为右值的对象是一个声明周期快结束的对象。

int &&rr=std::move(rr1);  //it is right
//写这个意味着,除了对rr1赋值或者销毁它之外,将不再使用它

使用move函数应该使用std::move,避免潜在的名字冲突。

实际上,为了保证移动语义的正确传递,程序员编写移动构造函数时,应该总是使用std::move转换拥有形如堆内存、文件句柄等资源的成员为右值,这样如果成员支持移动构造的话便可以轻松实现移动语义,哪怕成员没有移动构造函数,也至少将调用接收常量左值的构造函数实现拷贝构造,也不会出现问题。

拷贝构造和移动语义

通常实现时,实现一个接收const左值引用的拷贝构造函数,一个接收指向非const的右值引用的移动构造函数。

#include<iostream>
using namespace std;
static int n_cstr;  //记录初始化次数
static int n_dstr;   //记录析构次数
static int n_cptr;   //记录拷贝构造函数次数
class HasPtrMem
{
public:int* p;HasPtrMem() :p(new int(0)){cout << "construct:" << ++n_cstr << endl;  // 输出construct以及构造的次数,并且将次数+1}HasPtrMem(const HasPtrMem& h) :p(new int(*h.p)){cout << "copy construct:" << ++n_cptr << endl;  //输出copy construct以及拷贝的次数,将次W数+1}HasPtrMem(HasPtrMem&& h) :p(h.p) {h.p = nullptr; cout << "Move construct" << endl; }~HasPtrMem(){delete p;cout << "destruct:" << ++n_dstr << endl;  //输出destruct并且析构的次数,将次数+1}
};

采用上面的这个类,

int main()
{HasPtrMem a;cout << a.p << endl;HasPtrMem b(a);cout << b.p << endl;  //输出b的p所指的地址信息
}
/* 
运行结果:  调用了copy函数
construct:1
00774E70
copy construct:1
00774EA0
destruct:1
destruct:2
*/

可以看到调用了拷贝构造函数,地址是不同的。

int main()
{HasPtrMem a;cout << a.p << endl;HasPtrMem b(std::move(a));cout << b.p << endl;  //输出b的p所指的地址信息
}
/*
运行结果:   调用了move函数
construct:1
0157D9E8
Move construct
0157D9E8
destruct:1
destruct:2
*/

而通过move函数,将a转换为一个右值,从而调用了移动拷贝。

但是,如果a是一个const对象,那么会发生什么?

int main()
{const HasPtrMem a;cout << a.p << endl;HasPtrMem b(std::move(a));cout << b.p << endl;  //输出b的p所指的地址信息
}
/*运行结果
construct:1
011F4E70
copy construct:1
011F4EA0
destruct:1
destruct:2
*/

可以看到调用了copy拷贝构造函数,也就是说,哪怕用了move也不一定是会调用移动语义的,如果move的对象不是const那么将调用移动语义,否则仍是拷贝构造,因为移动构造会改变对象的内容,而const是拒绝改变的,因此会直接采用copy。

理解std::move和std::forward

这一部分的核心是:

  • std::move执行一个无条件的对rvalue的转化。对其本身而言,它不move任何东西,只是强制转化为右值
  • std::forward在参数被绑定为rvalue的情况下才会将它转化为rvalue
  • std::move和std::forward在runtime是什么都不做的

std::move是无条件地将其参数转化为一个右值,std::forward当特定条件满足时才会执行它的转换。

std::move的一个简洁实现方式:

template<typename T>
typename remove_reference<T>::type&&
move(T&& param)
{using ReturnType=typename remove_reference<T>::type&&;return static_cast<ReturnType> (param);
}

std::move实现时首先在 T上执行一个std::remove_reference,它去除T身上的引用,保证&&应用到了一个非引用类型上,确保返回的是右值引用。

首先还是需要注意,用了move确实会返回右值,但是如果原来的参数是const类型,则返回的也是const 右值引用,是不会和移动语义所匹配的,不过,由于const 左值引用具有万金油属性,所以会匹配到左值引用上去,从而实现一个拷贝构造。因此,如果想对这些对象执行move操作,就不要把它们声明为const,对const对象的move请求通常会悄悄的执行到copy操作上。

对于std::forward,只有当它的参数被一个lvalue初始化时,才会进行cast即转化操作。std::forward<T>()std::move()相区别的是,move()会无条件的将一个参数转换成右值,而forward()则会保留参数的左右值类型

区分通用引用和右值引用

通用引用(universal reference)。构成通用引用有两个条件:

  1. 必须满足T&&这种形式
  2. 类型T必须是通过推断得到的

看这段代码:

template <typename T>
class TestClass {public:void func(T&& t) {} 
}

因为T在初始化时已经知道是什么类型,所以不是推断得到是,是一个右值引用。

可以构成通用引用的有如下几种可能:

  • 函数模板参数(function template parameters)

     template <typename T>void f(T&& param);
    
  • auto声明(auto declaration)

     auto && var = ...;
    
  • typedef声明(typedef declaration)

  • decltype声明(decltype declaration)

对于通用引用来说,传进来的如果是左值引用那就是左值引用,如果是右值引用那就是右值引用,因此是实现forward的一个很好的方式

需要记住的东西:

如果一个函数的template parameter有着T&&d 格式,且有一个deduce type T。或者一个对象被声明为 auto &&,那么这个parameter或者object就是一个通用引用

如果type的声明的格式不完全是type &&,或者type deduction没有发生,那么type &&表示的是一个rvalue reference

对于通用引用来说,传进来的如果是左值引用那就是左值引用,如果是右值引用那就是右值引用

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. GUI编程核心技术AWT——键盘监听

    GUI编程核心技术AWT——键盘监听 package com.wei.lesson06;import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent;public class TestKeyListener {public static void main(String[] args) {new keyFrame();} } class keyFrame extends Fram…...

    2024/4/23 17:06:30
  2. Git设置代理,带用户名与密码

    公司软件需要设置代理才能连接外网。蓝色部分:用户名;绿色部分:密码;紫色部分:代理IP与端口,如:192.10.10.10:8080测试端口语句:参考链接及内容1:https://www.jianshu.com/p/b3154ae86fe2Git的代理设置也非常简单,一句话就搞定了:git config --global http.proxy ht…...

    2024/4/30 17:47:50
  3. Java是什么?Java能干什么工作?

    Java是一种为多个平台生成软件的编程语言。由Sun Microsystems的前计算机科学家James A. Gosling在20世纪90年代中期开发的。编译的代码可在大多数操作系统上运行。 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念。 Ja…...

    2024/5/1 1:10:28
  4. winscp,WinSCP软件有哪些用途

    WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端。同时支持SCP协议。它的主要功能就是在本地与远程计算机间安全的复制文件。WinSCP可以执行所有基本的文件操作,例如下载和上传。使用 WinSCP 可以连接到一台提供 SFTP (SSH File Transfer Protocol)或 SCP (Secure Co…...

    2024/4/30 19:09:32
  5. mac 10.15.6 Catalina 新系统后vmdk硬盘收缩方法

    随着VMware虚拟机使用时间的增长,其所占用的空间也越来越大,怎么给VMware虚拟机占用的空间进行瘦身。尤其在版本升级后空间消耗会奔溃!!! 方法一:macOS命令行清理 在mac下打开终端窗口,输入命令: cat /dev/zero > wipefile; rm wipefile当出现: cat: stdout: No sp…...

    2024/4/30 18:47:52
  6. Oracle VM VirtualBox 启动失败

    virtualbox 报错如下: 错误信息: VT-x is not available (VERR_VMX_NO_VMX). 返回 代码: E_FAIL (0x80004005) 组件: ConsoleWrap 界面: IConsole {872da645-4a9b-1727-bee2-5585105b9eed} 解决方式:1、有可能是因为win10开启了hyper-v,关闭即可、 2、bcdedit /set hypervi…...

    2024/4/24 2:59:33
  7. DPDK PMD( Poll Mode Driver)轮询模式驱动程序

    DPDK PMD( Poll Mode Driver)轮询模式驱动程序目录Mellanox PMDs轮询模式驱动程序要求和假设设计原则逻辑核心,内存和NIC队列关系设备标识,所有权和配置设备识别港口所有权设备配置即时配置发送队列的配置按需免费发送mbuf硬件卸载轮询模式驱动程序API共性通用数据包表示以…...

    2024/4/30 20:48:12
  8. 路由器分配ip理接

    1.如果两台设备都设置成自动获取IP,当接上交换机后交换机就会自动给两台设备分配IP,一般情况下会分配相同网段的IP,所以用ifconfig时候看不到固定的IP。2.两台设备进行udp通讯,一般会把外网IP设置成静态,这样在没有交换机的时候可以进行内部通讯。3.两台设备如果设置成自动…...

    2024/4/30 19:05:22
  9. NCCL填坑

    NCCL填坑简介篇章一篇章二篇章三篇章四篇章五篇章六 简介 简单介绍一下,我这新鲜热乎的坑。真的是太少见的了。本人在做pytorch分布式训练,晚上找了个小demo准备先让服务器热一下身。 顺手将共享文件传输改成了tcp传输dist.init_process_group(init_method=file:///home/****…...

    2024/5/1 1:13:45
  10. 势不可挡的DeFi浪潮与去中心化开源协议Hydra Network

    根据链上数据资源网站DeFi Pulse的统计数据,去中心化金融(DeFi)协议锁定的美元总值近日突破了60亿美元大关。目前,这一数字停留在63.2亿美元,相比三个月前刚突破的10亿美元大关,增长了近6倍。2020年上半年,DeFi项目在资产沉淀、价格升值和技术发展层面屡创新高,由去中心…...

    2024/4/30 21:51:55
  11. 大数据Hadoop学习之——网页排名PageRank算法

    一、算法说明PageRank即网页排名,也称佩奇排名(社会)。一些基本概念:1、网页入链:即投票,网页中对其他网页的超链接作为其他网页的入链,相当于对其他网页投一票;2、入链数量:如果一个网页获得其他网页的入链数量(投票)越多,说明该网页越重要;3、入链质量:即投票权…...

    2024/4/30 19:30:12
  12. K8S(06)web管理方式-dashboard

    K8S的web管理方式-dashboard [TOC] dashboard是k8s的可视化管理平台,是三种管理k8s集群方法之一 1 部署dashboard 1.1 获取dashboard镜像 获取镜像和创建资源配置清单的操作,还是老规矩:7.200上操作 1.1.1 获取1.8.3版本的dsashboard docker pull k8scn/kubernetes-dashboard-…...

    2024/4/30 19:11:07
  13. springboot出现MaxUploadSizeExceededException 异常

    写springboot项目上传图片遇到MaxUploadSizeExceededException 异常,找到一篇文章完美解决 Spring Boot 默认上传文件大小限制是 1MB,默认单次请求大小是 10MB,超出大小会跑出 MaxUploadSizeExceededException 异常。 问题来了,当文件超过 1M 和超过 10M 时异常是有区别的,…...

    2024/4/30 20:38:59
  14. 容器方式部署k8s集群

    容器方式部署k8s集群 初始化系统环境 k8s1 192.168.138.162 k8s2 192.168.138.163 k8s3 192.168.138.164 设置系统主机名以及 Host 文件的相互解析 分别给三台主机设置主机名为:k8s1、k8s2、k8s3 添加三台主机hosts相互解析vim /etc/hosts 192.168.138.162 k8s1 192.168.138.1…...

    2024/4/30 17:46:00
  15. 8.21 BTC早间行情分析

    行情回顾:比特币行情至昨日在11700-11800区域震荡之后,晚间出现小幅上行,价格开始逐渐稳定在11800上方。日内比特币上行力度不强,高点触及11880位置后开始承压回调,但是并未跌破11800一线,行情进入高位震荡阶段。比特币早间详细行情分析:日线级别的图上看,昨日K线是一个…...

    2024/4/30 21:24:58
  16. 2020焊工(初级)模拟考试及焊工(初级)考试软件

    题库来源:安全生产模拟考试一点通公众号小程序2020焊工(初级)模拟考试及焊工(初级)考试软件,包含焊工(初级)模拟考试答案解析及焊工(初级)考试软件练习。由安全生产模拟考试一点通公众号结合国家焊工(初级)考试最新大纲及焊工(初级)考试真题出具,有助于焊工(初…...

    2024/4/30 17:02:35
  17. 娃哈哈开起奶茶店,“情怀杯”能否撑起半边天?

    娃哈哈在转型路走得艰辛,但从未放弃。 无论是王力宏代言的娃哈哈纯净水,80、90后的童年记忆AD钙奶,还是风靡一时的营养快线,都是娃哈哈打造出的明星产品。甚至当年推出的非常可乐都能在百事和可口可乐手上抢夺13%的市场份额。可见当年的娃哈哈势头正猛。 娃哈哈经历辉煌与落…...

    2024/4/30 19:55:58
  18. 划重点丨国内首个基于产业攻防实战的《零信任实战白皮书》发布

    随着云计算、大数据、物联网、移动互联网等技术的兴起,企业的业务架构和网络环境随之发生了重大的变化,高级持续性威胁攻击、内网安全事故频发,传统的网络安全架构已无法满足企业的数字化转型需求。在此背景下,“零信任”安全理念的作用和价值得到了进一步的认可和体现。为…...

    2024/4/24 4:11:44
  19. CentOS8 Django配置错误笔记

    一、在虚拟环境virtualenv里 1. 环境配置makemigrations时,错误提示未安装mysql-client,且yum里找不到资源原因:老库没有了,用DNF新库安装 解决:dnf install mysql-clientmigrate时,错误提示:OSError: mysql_config not found(Can’t connect to server through’/var/…...

    2024/4/22 3:04:09
  20. 车用总线技术 | 从另一种视角了解CAN FD

    在本文中,我们会介绍CAN FD(CAN Flexible Data-rate)的主要内容,包括:CAN FD框架,开销和效率,示例应用和CSS的CAN FD记录仪案例,以及CAN FD的发展趋势。CAN FD看起来很复杂,本文旨在提供一个通俗易懂的介绍,以全面了解CAN FD。为什么会出现CAN FD?CAN协议自1986年问…...

    2024/4/30 19:49:31

最新文章

  1. Java核心技术.卷I-上-笔记

    目录 面向对象程序设计 使用命令行工具简单的编译源码 数据类型 StringBuilder 数组 对象与类 理解方法调用 继承 代理 异常 断言 日志 面向对象程序设计 面向对象的程序是由对象组成的&#xff0c;每个对象包含对用户公开的特定功能部分和隐藏的实现部分从根本上…...

    2024/5/1 1:27:27
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 【项目新功能开发篇】开发编码

    作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…...

    2024/4/30 10:33:31
  4. 三防笔记本丨工业笔记本电脑丨车辆检修的应用以及优势

    伴随着汽车技术的不断更新迭代以及车辆复杂性的增加&#xff0c;现代车辆检修工作需要更高效、更精确的方法来确保车辆的安全和性能。在这过程中&#xff0c;工业笔记本电脑作为一种强大的工具&#xff0c;为车辆检修提供了诊断、记录、分析和解决问题的核心功能 故障诊断与维修…...

    2024/4/30 1:52:31
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/4/30 9:36:27
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/4/30 0:57:52
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/4/29 18:43:42
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/4/29 19:40:09
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/4/30 23:32:22
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/4/30 23:16:16
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/4/30 0:57:50
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/4/29 21:25:29
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/4/30 0:57:49
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/4/30 14:53:47
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/4/30 22:14:26
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/4/29 7:41:18
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/4/30 22:57:18
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/4/30 20:39:53
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/4/30 0:57:46
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/4/30 0:57:46
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/4/29 3:42:58
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/4/29 19:56:39
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/4/29 8:41:59
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/4/30 20:52:33
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57