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

做购物网站要多少钱河南省建设科技网站

做购物网站要多少钱,河南省建设科技网站,seo北京公司,sem和seo都包括什么一、本质定义 移动语义的本质是资源的 “窃取”或 “接管”。 移动语义是C11引入的资源管理机制,通过转移而非拷贝对象资源的所有权来提升性能。其核心在于右值引用(&&)和移动构造/赋值函数的组合实现。 移动语义是一种特殊的行为或者叫操作,std::move()函数…

一、本质定义

移动语义的本质是资源的 “窃取”或 “接管”。

         移动语义是C++11引入的资源管理机制,通过转移而非拷贝对象资源的所有权来提升性能。其核心在于右值引用(&&)和移动构造/赋值函数的组合实现。

        移动语义是一种特殊的行为或者叫操作,std::move()函数是其中一个体现了移动语义的操作,并不是说移动语义一定是使用了std::move()函数。常见的实现了移动语义的操作还有"移动构造","移动赋值运算符",所有实现了移动语义的操作,肯定是将资源(数据或者文件)的管理权转移给其他变量管理,都不涉及释放资源和重新构造操作。

二、解决什么问题

(拷贝与移动两种方案的概念和代码对比分析)

传统拷贝方案:在传统的 C++ 中,当进行对象复制时,比如通过拷贝构造函数或拷贝赋值运算符,会创建目标对象的一份完整的副本,这涉及对资源(如动态内存、文件句柄等)的复制。       

移动语义方案:移动语义允许我们将临时对象(通常是右值)所拥有的资源直接转移给目标对象,而不是进行复制。例如,在处理一个包含动态分配内存的类时,移动构造函数可以直接将临时对象的指针转移到新对象,而不用再分配内存并复制内容,这样大大减少了资源开销

以下是两种方案处理字符串赋值的操作对比,其中传统拷贝方案实现的效果是"给别人一份一样的";移动语义方案实现的效果是"拿走别人的那一份"。

#include <cstring>
#include <utility>
#include <iostream>class String {
private:char* data;     // 只是声明,还没有分配内存空间public:// 基础构造函数explicit String(const char* str = "") {data = new char[strlen(str) + 1];strcpy_s(data, strlen(str) + 1, str);}// 传统拷贝构造函数String(const String& src) {data = new char[strlen(src.data) + 1];strcpy_s(data, strlen(src.data) + 1, src.data);std::cout << "Copied\n";}// 移动构造函数String(String&& src) noexcept {data = src.data;src.data = nullptr;std::cout << "Moved\n";}~String() { delete[] data; }
};void process(String s) { /* 使用副本 */ }int main() {String s1("Hello");// 1.传统拷贝方案String s2 = s1;          // 输出"Copied"process(s1);             // 输出"Copied"// 2.移动语义方案String s3 = std::move(s1);  // 输出"Moved"process(std::move(s3));     // 输出"Moved"return 0;
}

三、什么功能

        从代码实现的角度来看,移动语义只有一个操作,那就是将"资源管理权转移给别人"。移动语义的功能,作用,意义都是从此衍生出来的,包括:有效避免大型资源文件的深拷贝,避免资源的重复分配和释放;转移资源管理权,根据需求更换管理者。

四、怎么使用

        (交代代码结构)

        观察以下代码可以感受移动语义代码的触发时机, 代码编写逻辑,实际效果。其实下方代码结构很简单,主要是一个Resource类中,成员变量有两个,成员函数包含2个用于创建新对象的构造函数,2个用于重新赋值的'='重载运算符,移动语义就是这两个重载运算符中体现的。


#include <iostream>
#include <utility>class Resource {
private:int* data;std::string name;
public:// 1. 拷贝构造函数Resource(const Resource& other) : data(new int(*other.data)), name(other.name) {print("拷贝构造");}// 2. 移动构造函数Resource(Resource&& other) noexcept : data(other.data), name(std::move(other.name)) {other.data = nullptr;print("移动构造");}// 3. 拷贝赋值运算符Resource& operator=(const Resource& other) {if(this != &other) {delete data;data = new int(*other.data);name = other.name;}print("拷贝赋值");return *this;}// 4. 移动赋值运算符Resource& operator=(Resource&& other) noexcept {if(this != &other) {delete data;data = other.data;name = std::move(other.name);other.data = nullptr;}print("移动赋值");return *this;}// 辅助函数void print(const std::string& msg) const {std::cout << msg << " => data:" << (data ? *data : 0) << " name:" << name << std::endl;}// 基础构造/析构Resource(int val, std::string n) : data(new int(val)), name(n) {}~Resource() { delete data; }
};int main() {Resource r1(1, "原始资源");Resource r2 = r1;          // 拷贝构造Resource r3(std::move(r1));// 移动构造(触发移动语义)Resource r4(2, "临时");r4 = r2;                   // 拷贝赋值r4 = std::move(r3);        // 移动赋值(触发移动语义)return 0;
}

五、move()原理

(代码+解释)

std::move()是一个库函数,主要用于转移资源管理权,参数可以接收左值引用和右值引用类型,返回值一定是该参数变量的右值引用类型,原理是根据推导规则区分出参数变量的实际引用类型,一次决定返回值类型,使用类型强制转换操作符,将参数变量强制转换成右值引用类型,作为返回值。这样做的意义是将一个变量转换成右值引用。

template<typename T>
constexpr std::remove_reference_t<T>&& move(T&& t) noexcept {return static_cast<std::remove_reference_t<T>&&>(t);
}

①constexpr:  告诉编译器,被我修饰的函数或者表达式,可以在"编译时"求值。 

②std::remove_reference_t<T> : 去除引用类型,将左值引用和右值引用都还原成基础类型。

③std::remove_reference_t<T> &&:组合效果,相当于(基础类型+&&)即变成右值引用类型。

④模板类函数的参数列表中的T&&:这是通用引用(也叫转发引用),可以同时接受左值引用和右值引用类型的变量,都可以作为参数,而且由于"类型推导规则"的存在,是能够区分出到底接受的是什么类型的引用聚。

⑤noexcept:告诉编译器,这个函数绝对不会抛出异常,不需要对这部分内容检查。

⑥static_cast<目标类型>(原始类型的变量):强制将原始类型的变量,转换为目标类型的变量,在此处的意义是,强行将类型为T的变量t,强制转换为,T&&右值引用类型的变量t。

作者结束语

        (总结是每篇文章独立的,结语是我固定的)

        这篇文章的结构安排应该是很清晰了,标题顺序,内容组织,代码解释都还不错,技术类文章的任务就是要教大家认识它,理解它,使用它。文章的内容我检查过很多次了,每篇文章都是一边查资料,一边理解整理,输出成文章,分享我的思考。点个免费的赞吧~

后续更多同样形式的分享,希望能通过我的文章给你更多思维的启发,更多思考问题的角度。


文章转载自:

http://ylZ7SNKQ.bxhch.cn
http://1qkU3zx8.bxhch.cn
http://TPDhEtII.bxhch.cn
http://KBlkYIY8.bxhch.cn
http://INWYISlH.bxhch.cn
http://sclW0D4K.bxhch.cn
http://ozsRp9s1.bxhch.cn
http://8uebxgEF.bxhch.cn
http://M4rQOLas.bxhch.cn
http://L4oJbyrI.bxhch.cn
http://PatxVmlx.bxhch.cn
http://tt2nUFKY.bxhch.cn
http://bgFjOodi.bxhch.cn
http://iotswpFK.bxhch.cn
http://emmCmfFF.bxhch.cn
http://AcDhMiTv.bxhch.cn
http://QaLeBgaC.bxhch.cn
http://CBwp5CL5.bxhch.cn
http://38MzTyhd.bxhch.cn
http://Ai1C4uZN.bxhch.cn
http://l1iXZEbO.bxhch.cn
http://bvrnU9oJ.bxhch.cn
http://Ln6PTCa5.bxhch.cn
http://bstKBMCm.bxhch.cn
http://uUtZriIZ.bxhch.cn
http://x8m4nXS8.bxhch.cn
http://Bc1wvv42.bxhch.cn
http://WsmgvqdW.bxhch.cn
http://Uzp9KPTC.bxhch.cn
http://J1igW56U.bxhch.cn
http://www.dtcms.com/wzjs/619475.html

相关文章:

  • 网站的上传与发布020网站开发多少钱
  • 西宁市网站建设高端网站开发与设计 需求分析
  • 做网站开公司南京科技网站设计有特点
  • 好网站分享wordpress 显示所有分类
  • 网站开发属于什么经营范围广告公司宣传册
  • 做网站买过域名之后wordpress 自定义循环
  • 用dw制作视频网站网站建设主动型电话销售话术
  • 安庆网站建设aqwzjs企业网站搭建价格
  • 泉企业网站建设免费网站模板在哪下载
  • php网站内容管理系统什么行业最容易做网站
  • 网站维护工程师丰镇市网站丰镇高铁在哪个位置建设
  • 二手车网站建设上海环球金融中心简笔画
  • 和田做网站的联系电话wordpress linux下载文件
  • 网站需求设计文档虚拟空间软件
  • 如何做整人网站昆明网站制作专业
  • asp公司企业网站模板源代码网站的建设原始代码
  • 大连网站代运营的公司有哪些推荐做任务网站
  • 教你做文案的网站推荐wordpress ping optimizer
  • 网站界面设计实验报告服务中心网站建设意见
  • 企业网站设计布局方式wordpress+屏蔽ip插件
  • 专业的网站建设找聚爱长春最新通告今天
  • 厦门建站公司哪家好怎么看到网站开发时间
  • 用阿里云做网站注意事项有什么搜图片的网站好
  • 网站建设技术知乎网站维护建设费应计入科目
  • 网站设计论文选题小型私人会所装修设计
  • 北京宏福建设工程有限公司网站仪征建设局网站
  • 网站开发技术方案与设施上海财务外包公司
  • 微信公众号 做不了微网站南通做微网站
  • 深一互联网站建设怎样混沌鸿蒙网站建设
  • 长春网站建设培训班上海网络公司网站建设