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

6.21 移动语义与智能指针

    //先构造,再拷贝构造//利用"hello"这个字符串创建了一个临时对象//并复制给了s3//这一步实际上new了两次String s3 = "hello";

背景需求: 这个隐式创建的字符串出了该行就直接销毁掉,效率比较低

可以让_pstr指向这个空间,可以让匿名对象的指针指向nullptr,这样析构函数判断是nullptr对于匿名对象就不会处理。

但是不能直接在拷贝构造函数中直接进行操作,因为可能有的并不是匿名对象的情况,直接将原本的销毁不合适

能对表达式取地址的,称为左值;不能取地址的,称为右值。

&1;//error取不到地址

&"hello"; //文字常量区可以取地址(补充如果文字是相同的会存在一个地方)

&(a + b);//error
&String("hello"); // error

右值存储的位置:

右值可以存储在内存中,比较复杂的或者放内存中性能更佳的时候。

右值也可以存在寄存器中,简单的变量往往放在寄存器中。

区分左右值不能通过存储位置和等号左右进行判断

非const左值引用只能绑定到左值,不能绑定到右值,也就是非const左值引用只能识别出左值。

const左值引用既可以绑定到左值,也可以绑定到右值,也就是表明const左值引用不能区分是左值还是右值。

所以接着上面就是我们需要确定只要是右值引用就可以使用特别的右值拷贝构造,而左值就是普通的拷贝构造函数。

右值引用:

右值引用不能绑定到左值,但是可以绑定到右值,也就是右值引用可以识别出右值

 String(String && rhs): _pstr(rhs._pstr)//浅拷贝{cout << "String(String&&)" << endl;rhs._pstr = nullptr;}

也就是说在有移动构造的时候,对于临时变量就不再调用以前的复制运算符函数

加上编译器的去优化参数 -fno-elide-constructors

发现没有再调用拷贝构造函数,而是调用了移动构造函数。

如果还没有就再加上 cstd = c++11

移动构造函数的特点:

1. 四大金刚只要是显示定义一个的时候,编译器就不再提供移动构造函数

2. 显示定义了拷贝构造没有移动构造,就会调用拷贝构造(临时)

3. 显示定义了移动构造,右值复制使用移动构造。

总结:移动构造函数优先级高于拷贝构造函数。也就是会尝试移动函数不行再常规

移动赋值函数

String & operator=(String && rhs){if(this != &rhs){delete [] _pstr;//浅拷贝_pstr = rhs._pstr;rhs._pstr = nullptr;cout << "String& operator=(String&&)" << endl;}return *this;
}

其实这地方还有有点容易混淆的,因为

String s = "hello"; 移动构造函数

String s = String("hello");移动构造函数 

s = String("xixi")        移动赋值运算符函数

移动赋值运算符函数特点和移动拷贝构造函数相同。

总结:

拷贝构造和赋值运算函数具有复制控制语义的函数

移动构造和移动复制有移动语句的函数移交控制权(移交控制权)

移动语义函数优于控制语义函数

    String s1("hello");//右值复制给左值,肯定不是同一个对象s1 = String("world");//创建了两个内容相同的临时对象,也不是同一对象String("wangdao") = String("wangdao");

std::move函数

背景需求:有时候可能必须需要用到右值,所以需要将左值转换为右值

   int a = 1;&(std::move(a)); //error,左值转成了右值int && r = std::move(a);

【注意】

值显式转换为右值后,原来的左值对象就无法正常工作了,必须要重新赋值才可以继续使用。

但是通过输出流运算符输出s1的 _pstr依然造成了程序的中断,所以说明对std::move(s1)的内容进行修改,会导致s1的内容也被修改。

std::move的本质是在底层做了强制转换(并不是像名字表面的意思一样做了移动)

这就更是说明了move只是欺骗系统说这是一个右值,让系统当作一个右值处理,并且将控制权也都交了出去,对于这个‘右值’的处理就是对于本身的处理。

【注意】在这个时候可能在移动赋值函数中,如果是使用move导致的(如果去掉自复制判断)自复制情况下就会出现问题,所以必须加上自复制判断。

String & operator=(String && rhs){if(this != &rhs){delete [] _pstr;//浅拷贝_pstr = rhs._pstr;rhs._pstr = nullptr;cout << "String& operator=(String&&)" << endl;}return *this;
}

右值引用本身的性质

int && func(){return 10;
}void test1(){// &func();  //无法取址,说明返回的右值引用本身也是一个右值int && ref = func();&ref;  //可以取址,此时ref是一个右值引用,其本身是左值
}

注意区分下列的情况。

第一二种情况,返回的都是副本临时值都是不能取地址的,第三种情况是全局变量的引用可以取地址,第四种情况是返回一个右值引用是不可以取地址的,但是如果是是在程序中定义的一个右值引用的话是可以进行取地址操作的,原因就是下述所讲有名字的右值引用是左值,无名字是右值。

有名字右值引用是左值,没有名字还是左值

String str2("wangdao");
String func2(){String str1("wangdao");str1.print();return str1;    //对于一个将亡的对象而言是调用移动构造//return str2;//长期存在的就调用拷贝构造函数
}void test2(){func2();//&func2(); //error,右值String && ref = func2();&ref;  //右值引用本身为左值
}

在上述代码中return语句是调用移动构造语句,而不是拷贝构造语句

return

总结:返回将亡值对象使用移动构造,否则调用拷贝构造

资源管理

背景需求:程序的出口比较多,如果在某一个出口忘记将资源释放的时候,不能很好的将资源释放

所以说想到可以通过一个类进行封装保护实现,就像是运算符重载一章中的middleLayer

class SafeFile
{
public://在构造函数中初始化资源(托管资源)SafeFile(FILE * fp): _fp(fp){cout << "SafeFile(FILE*) " << endl;}//提供方法访问资源void write(const string & msg){fwrite(msg.c_str(),1,msg.size(),_fp);}//利用析构函数释放资源~SafeFile(){cout << "~SafeFile()" << endl;if(_fp){fclose(_fp); cout << "fclose(_fp)" << endl;}}
private:FILE * _fp;
};void test0(){string msg = "hello,world";SafeFile sf(fopen("wd.txt","a+"));sf.write(msg);
}

同时也像是middleLayer中的担心会出现多次释放的情况所以也是直接在创建对象的时候就是用fopen而不是再赋给一个有名的指针。

RAII技术

RAII类的常见特征

RAII常见的特征:

1.构造函数中托管资源,析构中释放资源

2.不允许复制和赋值(对象语义)

3.提供若干访问方法 (->*读写)

值语义:可以进行复制或赋值(两个变量的值可以相同)

对象语义:不允许复制或者赋值

【联系】上面刚说了移动语义和赋值控制语义

常用手段:

  1. 将拷贝构造函数与赋值运算符函数设置为私有的
  2. 将拷贝构造函数与赋值运算符函数=delete
  3. 使用继承的思想,将基类的拷贝构造函数与赋值运算符函数删除(或设为私有),让派生类继承基类。

 使用最保险的就是将函数删除的方法

RAII类的模拟

借助于上面对于智能指针思想的描述的实现。 

template <class T>
class RAII
{
public://1.在构造函数中初始化资源(托管资源)RAII(T * data): _data(data){cout << "RAII(T*)" << endl;}//2.在析构函数中释放资源~RAII(){cout << "~RAII()" << endl;if(_data){delete _data;_data = nullptr;}}//3.提供若干访问资源的方法T * operator->(){return _data;}T & operator*(){return *_data;}T * get() const{return _data;}void set(T * data){if(_data){delete _data;_data = nullptr;}_data = data;}//4.不允许复制或赋值RAII(const RAII & rhs) = delete;RAII& operator=(const RAII & rhs) = delete;
private:T * _data;
};

智能指针

//<memory>头文件中

//std::auto_ptr         c++0x 不安全在c++17中已经丢弃

//std::unique_ptr    c++11

//std::shared_ptr     c++11

//std::weak_ptr        c++11

auto_ptr

在其中auto_ptr的赋值运算符函数和拷贝构造函数是可以使用的。

auto_ptr的拷贝构造实际上却是移动复制

template <class _Tp> 
class auto_ptr {
public://拷贝构造auto_ptr(auto_ptr& __a) __STL_NOTHROW //ap2的_M_ptr 被赋值为 ap调用release函数的返回值: _M_ptr(__a.release()) {}//ap调用release函数_Tp* release() __STL_NOTHROW {//用局部的指针__tmp接管ap的指针所指向的资源_Tp* __tmp = _M_ptr;_M_ptr = nullptr; //将ap底层的指针设为空指针return __tmp;//返回的就是原本ap管理的资源的地址}private:_Tp* _M_ptr;
};
    auto_ptr<int> ap2(ap);cout << "*ap2:" << *ap2 << endl; //okcout << "*ap:" << *ap << endl;  //error,因为底层是移动构造

该拷贝出现隐患被丢弃

unique_ptr(重要)

1. 独享所有权的指针 不允许进行复制或者赋值(对象语义),但是具有移动语义

2. 作为容器元素

当作为容器的元素传入的时候如果是直接传入一个左值的话,会调用复制运算符函数但是函数已经被删除,但是移动复制没有删除,所以说使用移动复制函数移交管理权。

就是使用匿名对象(move函数但是实际上的所有权被移交了,所以原来的指针失效,不用)

vector<unique_ptr<Point>> vec;unique_ptr<Point> up4(new Point(10,20));//up4是一个左值//将up4这个对象作为参数传给了push_back函数,会调用拷贝构造//但是unique_ptr的拷贝构造已经删除了//所以这样写会报错vec.push_back(up4);  //errorvec.push_back(std::move(up4));  //ok,但是不用还是移交了管理权!vec.push_back(unique_ptr<Point>(new Point(1,3))); //ok

share_ptr(重要)

背景需求: unique_ptr是独占所有权的智能指针,有时候需要共享,有了share_ptr

原理:类似cowstring的原理,就是有一个引用计数

特征:

1. 共享所有权(可以复制或者赋值),但是具有移动语义(有移动构造和移动复制)

2. 可以作为容器元素

如果是把左值属性的指针传进去,会出现复制操作。use_count会加1

但是会出现循环引用的问题

class Child;class Parent
{
public:Parent(){ cout << "Parent()" << endl; }~Parent(){ cout << "~Parent()" << endl; }//只需要Child类型的指针,不需要类的完整定义shared_ptr<Child> _spChild;
};class Child
{
public:Child(){ cout << "child()" << endl; }~Child(){ cout << "~child()" << endl; }shared_ptr<Parent> _spParent;
};
shared_ptr<Parent> parentPtr(new Parent());
shared_ptr<Child> childPtr(new Child());
//获取到的引用计数都是1
cout << "parentPtr.use_count():" << parentPtr.use_count() << endl;
cout << "childPtr.use_count():" << childPtr.use_count() << endl;

parentPtr->_spChild = childPtr;
childPtr->spParent = parentPtr;
//获取到的引用计数都是2
cout << "parentPtr.use_count():" << parentPtr.use_count() << endl;
cout << "childPtr.use_count():" << childPtr.use_count() << endl;

当栈上的指针删除的时候还会有引用计数都是1 

解决这个问题引入弱引用指针。,因为上述的环在有栈上的指针的时候只要是有一个引用计数不为2就可以解除这个环。因为当栈上指针不再指向的时候就会变成0,销毁后另外一个引用也变为0

week_ptr弱引用的指针

不会增加引用计数

week_ptr是一个弱引用的指针,不会增加引用计数。

对于上述问题的解决办法:将Parent类中的shared_ptr类型指针换成weak_ptr

week_ptr指向不会增加引用计数

可能出现的问题就是引用计数 减到0 _wpChild指针还指向这个位置,会不会出现访问错误问题

实际上week_ptr这个指针不能访问,因为是弱引用指针不能访问

weak_ptr知道所托管的对象是否还存活,如果存活,必须要提升为shared_ptr才能对资源进行访问,不能直接访问。

use_count()只能访问share_ptr的指针指向的个数,也就是知道week_ptr有没有指向空间

week_ptr的初始化的方式

weak_ptr<int> wp;//无参的方式创建weak_ptr//也可以利用shared_ptr创建weak_ptr 
weak_ptr<int> wp2(sp);

可能不成功当没有空间可以管理的时候,否则有另外一个shared_ptr指针指向。

shared_ptr<int> sp2 = wp.lock();
if(sp2){
cout << "创建shared成功" << endl;
cout << *sp2 << endl;
}else{
cout << "创建shared失败,托管的空间已经被销毁或者没有资源可以管理" << endl;
}

expired函数

bool flag = wp.expired();
if(flag){
cout << "托管的空间已经被销毁" << endl;
}else{
cout << "托管的空间还在" << endl;
}

删除器

unique指针的(模板参数)

背景需求: 默认的删除器使用的是delete,不能回收fopen打开的文件,因为是delete而不能是fclose。

问题描述:如果是使用原本的删除器继续使用delete,不close写的内容可能不能刷新缓冲区,如果再手动close会导致double free问题,因为delete底层本身就是free函数。

所以说需要自定义删除器将删除器中的处理设置为fclose。

struct FILECloser{
void operator()(FILE * fp){if(fp){fclose(fp);cout << "fclose(fp)" << endl;}
}
};
void test1(){
string msg = "hello,world\n";
unique_ptr<FILE,FILECloser> up(fopen("res2.txt","a+"));
//get函数可以从智能指针中获取到裸指针
fwrite(msg.c_str(),1,msg.size(),up.get());
}

shared_ptr(作为构造函数参数)

智能指针误用

将一个资源(原生指针)交给两个指针指针管理

void test0(){
//需要人为注意避免
Point * pt = new Point(1,2);
unique_ptr<Point> up(pt);
unique_ptr<Point> up2(pt);//error,出现double free
}

//unique是独占的因此不能共同管理一个对象。

void test2(){
Point * pt = new Point(10,20);
shared_ptr<Point> sp(pt);
shared_ptr<Point> sp2(pt);//error
}

//虽然说shared_ptr是可以共享的,但是也必须是使用赋值和复制的行为才是可以的,否则不可以

 这个地方addPoint如果是放回的是Point*就会出现sp3和sp管理一个Point*原生指针,

如果是返回的是shared_ptr<Point>(this)这种情况也是sp和匿名对象共用this这个point对象指针

这个地方就是用到动态内存管理中的辅助类(enable_shared_from_this)中的成员函数(shared_from_this)来实现功能。就是使用继承的方式在该类中可以使用类的成员函数。

相关文章:

6.21 移动语义与智能指针

//先构造&#xff0c;再拷贝构造//利用"hello"这个字符串创建了一个临时对象//并复制给了s3//这一步实际上new了两次String s3 "hello"; 背景需求&#xff1a; 这个隐式创建的字符串出了该行就直接销毁掉&#xff0c;效率比较低 可以让_pstr指向这个空间…...

Kimi还能对学术论文进行润色?我来教你!

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 一、引言 在学术界&#xff0c;论文的质量往往决定了研究的可信度和影响力。Kimi作为一款人工智能助手&#xff0c;可以为学术论文的润色提供有效的帮助。本文将详细介绍如何利用Kimi进…...

智汇云舟成为中煤集团中煤智能创新联盟成员单位

6月21日&#xff0c;第八届世界智能产业博览会平行会议暨中煤智能创新联盟交流会在天津水游城丽筠酒店顺利举行。智汇云舟受邀参与&#xff0c;并由中国中煤能源集团授予荣誉证书&#xff0c;正式成为中煤智能创新联盟成员单位。会议上&#xff0c;清华大学、中国矿业大学&…...

【文心智能体大赛】迎接属于你的休闲娱乐导师!

迎接属于你的休闲娱乐导师&#xff01; 前言创建智能体发布智能体最后结语 前言 文心智能体平台AgentBuilder 是百度推出的基于文心大模型的智能体&#xff08;Agent&#xff09;平台&#xff0c;支持广大开发者根据自身行业领域、应用场景&#xff0c;选取不同类型的开发方式&…...

AI:音乐创作的未来还是毁灭的序曲?

AI&#xff1a;音乐创作的未来还是毁灭的序曲&#xff1f; 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;它已经渗透到了我们生活的方方面面&#xff0c;包括音乐领域。然而&#xff0c;AI在音乐创作中的角色引发了广泛的讨论和争议。一些人认为AI为音乐…...

如何通过AI进行智能日志异常检测

智能日志异常检测是一种利用人工智能&#xff08;AI&#xff09;技术来自动识别日志数据中异常模式或行为的方法。传统日志监控依赖于预定义规则&#xff0c;而智能日志异常检测可以适应不同的日志模式和异常类型&#xff0c;提高检测准确性和效率。下面是一个完整的步骤指南&a…...

C++ GPU编程(英伟达CUDA)

安装编译环境 https://developer.download.nvidia.com/compute/cuda/12.5.0/local_installers/cuda_12.5.0_555.85_windows.exe CMakeLists.txt cmake_minimum_required(VERSION 3.10)set(CMAKE_CXX_STANDARD 17) set(CMAKE_BUILD_TYPE Release) #set(CMAKE_CUDA_ARCHITECTUR…...

肾虚学习实验第T1周:实现mnist手写数字识别

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 目录 一、前言 作为一名研究牲&#xff0…...

Python | Leetcode Python题解之第162题寻找峰值

题目&#xff1a; 题解&#xff1a; class Solution:def findPeakElement(self, nums: List[int]) -> int:n len(nums)# 辅助函数&#xff0c;输入下标 i&#xff0c;返回 nums[i] 的值# 方便处理 nums[-1] 以及 nums[n] 的边界情况def get(i: int) -> int:if i -1 or…...

定个小目标之刷LeetCode热题(26)

这道题属于一道简单题&#xff0c;可以使用辅助栈法&#xff0c;代码如下所示 class Solution {public boolean isValid(String s) {if (s.isEmpty())return false;// 创建字符栈Stack<Character> stack new Stack<Character>();// 遍历字符串数组for (char c : …...

网络爬虫设置代理服务器

目录 1&#xff0e;获取代理 IP 2&#xff0e;设置代理 IP 3. 检测代理 IP 的有效性 4. 处理异常 如果希望在网络爬虫程序中使用代理服务器&#xff0c;就需要为网络爬虫程序设置代理服务器。 设置代理服务器一般分为获取代理 IP 、设置代理 IP 两步。接下来&#xff0c;分…...

3、matlab单目相机标定原理、流程及实验

1、单目相机标定流程及步骤 单目相机标定是通过确定相机的内部和外部参数&#xff0c;以便准确地在图像空间和物体空间之间建立映射关系。下面是单目相机标定的流程及步骤&#xff1a; 搜集标定图像&#xff1a;使用不同角度、距离和姿态拍摄一组标定图像&#xff0c;并确保标…...

【gdb 如何生成并查看core dump】

生成core dump 使用ulimit命令来设置core dump文件的大小。 ulimit -c unlimitedcore dump位置 如果程序崩溃&#xff0c;系统会生成一个名为core的文件。可以通过以下命令查看core文件位置&#xff0c; cat /proc/sys/kernel/core_pattern查看core dump gdb /path/to/you…...

极简短视频查看、删除应用

本地短视频服务器 背景&#xff1a;我的NAS中存放了很多短视频&#xff0c;多到很多没看过&#xff0c;于是写了这个程序来随机查看并删除短视频 运行&#xff1a; 安装依赖后运行main.py 直接使用docker&#xff1a; docker pull realwang/short_video docker run -d -p 3000:…...

【秋招刷题打卡】Day01-自定义排序

Day01-自定排序 前言 给大家推荐一下咱们的 陪伴打卡小屋 知识星球啦&#xff0c;详细介绍 >笔试刷题陪伴小屋-打卡赢价值丰厚奖励 < ⏰小屋将在每日上午发放打卡题目&#xff0c;包括&#xff1a; 一道该算法的模版题 (主要以力扣&#xff0c;牛客&#xff0c;acwin…...

API低代码平台介绍6-数据库记录删除功能

数据库记录删除功能 在前续文章中我们介绍了如何插入和修改数据库记录&#xff0c;本篇文章会沿用之前的测试数据&#xff0c;介绍如何使用ADI平台定义一个删除目标数据库记录的接口&#xff0c;包括 单主键单表删除、复合主键单表删除、多表删除&#xff08;整合前两者&#x…...

计算机基础之:硬件系统的性能评估标准

服务器时钟的性能通常涉及多个方面&#xff0c;主要包括准确性、稳定性、以及对系统性能的影响。以下是一些关键指标和衡量方法&#xff1a; 准确性&#xff1a; 时间偏移&#xff1a;测量服务器时钟与一个可靠时间源&#xff08;如GPS时间、原子钟或NTP服务器&#xff09;之间…...

高互动UI设计揭秘:动画效果如何提升用户体验

动画&#xff0c;由于其酷的视觉冲击&#xff0c;往往会产生极好的用户体验。UI设计中的动态效果可以使用户界面看起来更酷&#xff0c;特别是界面的功能动画&#xff0c;是UX设计的重要组成部分&#xff0c;不容忽视。为什么UI设计的动态效果如此重要&#xff1f;接下来&#…...

探索Java异常处理的奥秘:源码解析与高级实践

1. 引言 在Java编程的广阔天地中,异常处理是确保程序健壮性、稳定性和可维护性的重要基石。对于Java工程师而言,深入理解Java异常处理的机制,并能够在实践中灵活运用,是迈向卓越的重要一步。 2. 基本概念 在Java中,异常(Exception)是程序执行期间出现的不正常或错误情况…...

深入了解python函数与函数内存使用

函数的定义 函数作为代码复用的基本单元&#xff0c;可以帮助我们组织代码、减少重复、提高可读性和可维护性。 在 Python 中&#xff0c;函数本质上是对象&#xff0c;可以赋值给变量、存储在数据结构中、作为参数传递和返回。 函数与内存 函数的加载和调用过程中&#xff…...

Java面试----MySQL面试题

1.索引有哪些优缺点&#xff1f; MySQL索引作为一种提升数据库查询效率的重要机制&#xff0c;具有以下主要优点和缺点&#xff1a; 优点&#xff1a; 提高查询速度&#xff1a; 索引能够显著加速数据的检索过程&#xff0c;类似于书籍的目录&#xff0c;让数据库引擎能够快速…...

python从入门到精通2:缩进

在Python中&#xff0c;缩进&#xff08;Indentation&#xff09;是一个非常重要的语法元素&#xff0c;它用于表示代码块的结构。与其他许多编程语言使用大括号 {} 来定义代码块不同&#xff0c;Python使用缩进来确定代码块的开始和结束。这种简洁的语法使得Python代码更加清晰…...

了解CDN:提升网络性能和安全性的利器

在当今的数字时代&#xff0c;网站性能和安全性是每一个网站管理员必须关注的核心问题。内容分发网络&#xff08;CDN&#xff0c;Content Delivery Network&#xff09;作为解决这一问题的重要工具&#xff0c;逐渐成为主流。本文将详细介绍CDN的定义、作用及其工作原理&#…...

ChatGPT的工作原理

ChatGPT的工作原理可以详细分为以下几个步骤&#xff0c;下面将结合相关信息进行清晰、详细的介绍&#xff1a; 数据收集&#xff1a; ChatGPT首先会从大量的文本数据中收集信息&#xff0c;这些数据可能包括网页、新闻、书籍等多样化的来源。它还会特别关注和分析网络上的热点…...

基于DPU的云原生裸金属服务快速部署及存储解决方案

1. 背景介绍 1.1. 业务背景 在云原生技术迅速发展的当下&#xff0c;容器技术因其轻量级、可移植性和快速部署的特性而成为应用部署的主流选择&#xff0c;但裸金属服务器依然有其独特的价值和应用场景&#xff0c;是云原生架构中不可或缺的一部分。 裸金属服务器是一种高级…...

论文学习_Large Language Models Based Fuzzing Techniques: A Survey

论文名称发表时间发表期刊期刊等级研究单位Large Language Models Based Fuzzing Techniques: A Survey 2024年arXiv-悉尼大学 0.摘要 研究背景在软件发挥举足轻重作用的现代社会,软件安全和漏洞分析对软件开发至关重要,模糊测试作为一种高效的软件测试方法,并广泛应用于各个…...

响应式德米拉数字内容交易系统素材下载站模板

★模板说明★ 该数字交易系统设计非常完美&#xff0c;两种响应式模式&#xff0c;可打开边栏模式和盒子模式&#xff1b;八种网站颜色&#xff0c;四种风格颜色可供用户自行选择&#xff0c;还可在网站选背景图片&#xff1b;完美的分成系统、充值功能、个人中心等等都以html…...

数据库开发-MySQL

前言 首先来了解一下什么是数据库。 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。 像我们日常访问的电商网站京东&#xff0c;企业内部的管理系统OA、ERP、CRM这类的系统&#xff0c;以及大家每天都会刷的头条、抖音类的app…...

香港大带宽服务器高性能配置选择灵活

香港大带宽服务器是指在香港数据中心托管的&#xff0c;配备了高速网络连接的服务器。这些服务器通常用于需要大量数据传输和快速响应时间的应用&#xff0c;如视频流媒体、在线游戏、远程工作和大规模数据处理任务。具体分析如下&#xff0c;rak部落为您整理发布。 1. **内存配…...

Oracle中生僻汉字的解决办法

在Oracle数据库中处理生僻汉字时&#xff0c;主要面临的问题是某些字符集可能无法完全支持所有的汉字&#xff0c;特别是生僻字。以下是一些解决Oracle中生僻汉字问题的办法&#xff1a; 检查当前字符集&#xff1a; 使用SELECT USERENV(language) FROM dual;命令来查看当前数…...

唯品会一家专做特卖的网站/济南网络优化网址

日前&#xff0c;市场调研机构IDC在一份报告中指出&#xff0c;2016年企业在云环境中部署IT基础设施的开支将增长18.9%&#xff0c;达到382亿美元。这些产品包括服务器、存储和以太网交换机。 尽管在非云环境中部署企业IT基础设施的开支有所下滑&#xff0c;幅度为4%&#xff0…...

群晖 搭建两个wordpress/seo网络推广外包公司

Spring AOP 提供了 5 种类型的通知&#xff0c;它们分别是 Before Advice&#xff08;前置通知&#xff09;、After Returning Advice&#xff08;后置通知&#xff09;、Interception Around Advice&#xff08;周围通知)、Throws Advice&#xff08;异常通知&#xff09;和 I…...

施工企业负责人培训/官网seo关键词排名系统

先从原理上分析切片运算&#xff1a; list的切片&#xff0c;内部是调用__getitem__&#xff0c;__setitem__,__delitem__和slice函数。而slice函数又是和range()函数相关的。 给切片传递的键是一个特殊的slice对象。该对象拥有可描述所请求切片方位的属性&#xff0c;例如&…...

织梦做导航网站/seo是网络优化吗

本文整理一下使用php和mysql向前端推送数据的过程。数据库部分&#xff1a;1.首先安装服务器&#xff0c;我选择xampp&#xff0c;安装可以选择任意地址。安装完成&#xff0c;打开xampp-control.exe 。选择开启Apache和MySQL&#xff1a;2.浏览器进去http://localhost/phpmyad…...

wordpress微型SEO商城/百度无锡营销中心

作为RFID技术的演进版本&#xff0c;NFC与RFID相比具有那些优点而受到手机厂商和运营商如此青睐&#xff0c;让我们一一解读。      NFC定义      NFC是NearFieldCommunication缩写&#xff0c;即近距离无线通讯技术。由飞利浦公司和索尼公司共同开发的NFC是一种非接触…...

徐州免费网站建设/空间刷赞网站推广

最近公司申请了华为云的资源做测试。在丢了一个小项目上去测试之后&#xff0c;发现系统CPU异常繁忙&#xff0c;系统重启之后情况依旧&#xff0c;连接服务器异常缓慢。这时也接到华为云的客服电话说测试服务器同***服务器之间有通信&#xff0c;让我们确认是不是正常的情况。…...