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

亅新厦建设集团网站网站策划书模板

亅新厦建设集团网站,网站策划书模板,wordpress 独立图片服务器,如何做外卖网站app移动语义 C11中提供了一个新特性-移动语义,使用std::move实现,用法为 std::move MyClass A; MyClass B std::move(A);移动语义的意义是当一个临时变量生命周期要结束了,但是需要使用其初始化另外一个变量,例如函数的返回值&am…

移动语义

C++11中提供了一个新特性-移动语义,使用std::move实现,用法为

std::move

MyClass A;
MyClass B = std::move(A);

移动语义的意义是当一个临时变量生命周期要结束了,但是需要使用其初始化另外一个变量,例如函数的返回值(非指针),就是一个临时变量。我们知道,使用一个类去初始化另外一个类可以使用拷贝的方式,即调用类的拷贝构造函数或赋值运算符函数,为了防止类中内容出现指针悬垂情况,类的拷贝构造和赋值运算符都会写成深拷贝的模式,即需要重新申请一块内存再将数据存放进去。而移动语义则是直接占为己有,即把数据直接转移到另一个实例化的类中,避免了拷贝带来的性能花销。std::move函数的用处就是告诉编译器,这个对象已经不需要了,可以直接转给别的类使用。
下面展示一个例子:

#include <iostream>
#include <vector>using namespace std;
class MyClass
{
public:MyClass(const char* _name) {id = 0;name = new char[256];memset(name, 0, 256);strcpy_s(this->name, 256, _name);cout << "Call Constructor, name address = " << static_cast<void*>(name) << endl;}MyClass(const MyClass& other) {if (this->name)delete this->name;this->name = new char[256];memset(this->name, 0, 256);strcpy_s(this->name, 256, other.name);this->id = other.id;cout << "Call Copy Constructor, name address = " << static_cast<void*>(name) << endl;}~MyClass() {cout << "Call Destructor, name address = " << static_cast<void*>(name) << endl;if (name)delete[] name;}private:int id;char* name = nullptr;
};MyClass func()
{return MyClass("aaa");
}int main()
{MyClass a = move(func());MyClass b = func();
}

运行这段代码会发现拷贝构造函数被调用了,原因是因为类中没有定义移动构造函数,编译器只能去调用拷贝构造函数。

移动构造函数

下面就来实现移动拷贝构造函数。为了实现移动语义,C++11新增了一个新特性,叫做右值引用,使用双&定义。单一&定义的是左值引用。

int a = 0;
int& b = a;	// 左值引用
int&& c;	// 右值引用

让编译器将一个变量匹配成右值引用的情况有两个

  1. 一个在执行语句后就会被释放的临时变量
  2. 使用std::move标记的变量

将变量匹配成右值引用是实现移动语义的基础

实现移动构造函数的思路就是移动语义的含义,直接将另一个类的数据内存直接接管,同时还需要注意一个重点,就是把传入对象的数据清除。
移动构造函数的参数就是上述说的右值引用,在上述类中添加上移动构造函数:

// 实现深拷贝类
class MyClass
{
public:MyClass(const char* _name) {id = 0;name = new char[256];memset(name, 0, 256);strcpy_s(this->name, 256, _name);cout << "Call Constructor, name address = " << static_cast<void*>(name) << endl;}MyClass(const MyClass& other) {if (this->name)delete this->name;this->name = new char[256];memset(this->name, 0, 256);strcpy_s(this->name, 256, other.name);this->id = other.id;cout << "Call Copy Constructor, name address = " << static_cast<void*>(name) << endl;}// 移动构造函数MyClass(MyClass&& other) noexcept {this->id = move(other.id);// 直接移动this->name = other.name;// move对原始指针没用,直接接管即可other.name = nullptr;cout << "Call Move Constructor, name address = " << static_cast<void*>(name) << endl;}MyClass& operator=(const MyClass& other) {if (this != &other){if (this->name)delete this	->name;this->name = new char[256];memset(this->name, 0, 256);strcpy_s(this->name, 256, other.name);this->id = other.id;}cout << "Call operator, name address = " << static_cast<void*>(name) << endl;return *this;}~MyClass() {cout << "Call Destructor, name address = " << static_cast<void*>(name) << endl;if (name)delete[] name;}private:int id;char* name = nullptr;
};

总结

当出现一些只为了提供给另外一个类实例化的变量时,例如函数返回临时变量或是将一个实例化的类push_back到vector中而无其他用处,就可以使用移动语义的方式,以减少程序运行时出现的拷贝,减少性能消耗。

http://www.dtcms.com/wzjs/501408.html

相关文章:

  • 网络营销的步骤天津优化公司哪家好
  • 法库网站建设app注册推广任务平台
  • php企业网站开发淘宝seo搜索排名优化
  • wordpress占用资源青岛百度seo代理
  • 色彩 导航网站互联网推广的方式
  • 阜阳恒亮做网站多少钱自己做网站设计制作
  • 2o17甘孜建设网站seo排名优化的方法
  • 深圳罗湖网站建设互联网精准营销
  • ecshop 网站首页不显示怎么办关键词排名点击软件工具
  • 网站的建设任务seo排名优化
  • 网站页面静态化方案友情链接英文
  • 广州市网站建设公司在哪里推广软文代发
  • 星巴克网站建设方案有什么可以做推广的软件
  • 个人可以做哪些网站上海最新事件
  • 新乡网站关键词优化服务器租用
  • wordpress自带播放器进度条厦门网站seo哪家好
  • 动态网站建设与管理课程设计报告seo搜索推广
  • 网站内容建设 发布形式关键词优化是什么意思
  • 海口 做网站一键建站
  • 海报设计网站官网sem推广竞价
  • 建站网站公司调查软文大全
  • 品牌 网站建设株洲网络推广
  • 怎样做网站变手机软件坚决把快准严细实要求落实到位
  • 有没有专做美女图片的网站2021十大网络舆情案例
  • 台州外贸网站建设天津百度推广网络科技公司
  • 东莞政务网站建设方案百度快照投诉中心
  • 兰州网络推广徽hyhyk1win7优化教程
  • 网站标准宽度百度数据中心
  • 黑色炫酷的监控网站html设计网站接单
  • 北京大兴专业网站建设公司免费引流app下载