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

多语种外贸网站wordpress网站主题插件

多语种外贸网站,wordpress网站主题插件,wordpress七牛云缩略图,数字营销课程左值右值 什么是左值右值 ​ 左值右值的概念我们一般理解为赋值号左边或者右边的值,这样理解也是有一定的道理的,但是实际上,左值右值绝不只是简简单单的定义,用好它绝对会大大提高编程效率。首先,严格意义上的左值右…

左值右值

什么是左值右值

​ 左值右值的概念我们一般理解为赋值号左边或者右边的值,这样理解也是有一定的道理的,但是实际上,左值右值绝不只是简简单单的定义,用好它绝对会大大提高编程效率。首先,严格意义上的左值右值取决于其是否能取地址,上代码:

#include <iostream>int main() {int a = 5;std::cout << &a << std::endl;       // 输出:0x7ffe7580b204std::cout << &5 << std::endl;       // 报错:lvalue required as unary ‘&’ operand
}

报错内容就是:不能将&运算符应用于右值。之所以称呼为左值右值,是因为左值大多可以用赋值号修改(除了用const修饰的)。当然,除了这些最简单的变量,还有很多比较奇怪的左值右值,这里也列举一下:

#include <iostream>int x;int& func_ref() {return x;
}class obj{double member;
}int main() {int a = 10;         // a 是左值int* p = &a;        // 正确,a 可寻址a = 20;             // 正确,左值可修改int& ref = a;		// ref是左值int array[3] = {1, 2, 3};  // 数组元素是左值obj.member = 5;		// 类成员是左值int b = a + 5;      // a 作为右值使用(隐式转换)func_ref() = 30;    // 正确,func_ref() 返回左值引用,实际上func_ref()就是变量x的引用std::cout << func_ref() << std::endl;		// 输出30const int c = 40;// c = 50;          // 错误,c 是 const 左值,不可修改const char *ptr = &"hello"[0]; // 正确,“hello”是左值 
}

​ 这里有一个比较难以理解,就是hello竟然是左值,而且可以取地址,这将在下面特性介绍中提到。

左值右值的特性

​ 首先,就是我们上面提的,左值可以使用取地址符&,我们称之为可寻址性,那么右值也就具有不可寻址性。其次,左值的生存周期通常超出当前语句的作用域,这句话也很好理解,比如int x = 5,那么在这句代码后仍然可以使用变量x,而这里的右值5,超过这句话后,就不存在了,下一次即使出现相同的5也和它时不一个量了。

​ 除此之外,还有他们的储存位置也不尽相同。对于左值而言,它通常存放在中,比如int x = 5,这里的x就存放在栈中,除此之外,还有可能存放在静态区等位置,而右值会存放在寄存器栈临时空间等位置,甚至无储存,很明显就是右值没有可以持久的储存位置。

​ 这里我们解释一下上面提到的hello为什么是左值,作为C++字符串而言,它的设计继承了C语言的特性,C语言中的设计也是如此,当我们使用字符串比如hello时,它通常是具有静态存储期的 const char[N] 数组对象,与其他类型的字面量如5不同。对于这一点我觉得没有必要深究原因,留个心眼即可。

右值的引入

​ 实际上,C++98/03是只有左值,没有右值这个概念的,之所以C++11引入这个概念是出于对性能的考虑,这也就是我在文首说的,它绝不仅仅只是个定义这么简单。上代码,注意下面的std::move()函数:

#include <iostream>
#include <vector>
#include <chrono>int main() {const int DATA_SIZE = 10000000;  // 一个包含 1000 万个 double 的向量// 创建一个大型 vector(模拟需要拷贝的数据)std::vector<double> src(DATA_SIZE, 3.14);// 方法 1:深拷贝(拷贝构造函数)auto start_copy = std::chrono::high_resolution_clock::now();std::vector<double> dest_copy = src;  // 深拷贝auto end_copy = std::chrono::high_resolution_clock::now();auto duration_copy = std::chrono::duration_cast<std::chrono::microseconds>(end_copy - start_copy).count();// 方法 2:移动语义(std::move)auto start_move = std::chrono::high_resolution_clock::now();std::vector<double> dest_move = std::move(src);  // 移动语义auto end_move = std::chrono::high_resolution_clock::now();auto duration_move = std::chrono::duration_cast<std::chrono::microseconds>(end_move - start_move).count();// 输出结果std::cout << "深拷贝耗时: " << duration_copy << " 微秒" << std::endl;std::cout << "移动语义耗时: " << duration_move << " 微秒" << std::endl;return 0;
}

​ 这里我们定义了一个包含1000万个double类型的向量,并用传统的赋值方式拷贝至另一个向量,记录下拷贝所需时间,同时用移动语义的方法拷贝相同的数组,记录下所需时间,并输出,输出结果如下:

深拷贝耗时: 41368 微秒
移动语义耗时: 0 微秒

​ 性能差别就是这么大,我们解释一下。这里的深拷贝其实就是一个一个复制这个数据,转到需要拷贝的向量中,而移动语以就是只偷这块内存的指针,为我所用,所以其时间复杂度为O(1),当然,在这之后,原本的数据就为空了(但并不违法),如果我们在上面的代码中分别输出拷贝后的向量大小,就会发现,第一个仍然是一千万个变量,而移动后就归零了。

​ 举个例子就是需要将一个快递寄给另一个地方,第一种做法是,把快递拿出来,按照原样再做一个,再装进另一个快递箱中,再贴上一个新的快递单,第二种做法就是撕掉之前的快递单,贴上新的快递单,(之前的快递单贴在了一个空箱子上)。

​ 那么,这和左值右值有什么关系呢?事实上,向量src在使用函数std::move()后,它就从左值变为右值了,因为只有右值存在移动语义,因此这里的std::move()函数并不是真的移动,它只是将左值变为右值。因此,对于一些容器的拷贝操作,我们应该能想到右值的存在。

附录

附录一

填坑:右值引用

​ 上篇博客中我们提到了右值引用的概念,并且给出了定义方式&&,这里,我们详细说说右值引用究竟有什么用。实际上,我们不太会去定义一个右值引用,当然,如果你强行使用一个右值引用一个常量,也并不会有什么问题,而且还会将这个右值的生命周期延长到引用的作用域,但是这着实是tuokuzifangpi。右值引用的作用也正是上面提到的拷贝中的优点,至于&&符号,别忘了,函数参数可以使用得到,这里上一个简单的代码尝尝鲜:

#include <iostream>// 定义一个函数,接收 int 的右值引用参数
void processInt(int&& x) {std::cout << "Received rvalue: " << x << std::endl;
}int main() {int a = 100;processInt(std::move(a));// 直接传递一个右值字面量也可以processInt(200);return 0;
}

文章转载自:

http://kWFRAD4N.Lwcgh.cn
http://Umm60YDe.Lwcgh.cn
http://Umreasrw.Lwcgh.cn
http://Ij9b3MgM.Lwcgh.cn
http://OUsGDHym.Lwcgh.cn
http://9tQFRA8I.Lwcgh.cn
http://pijT6C7B.Lwcgh.cn
http://tB1iQezN.Lwcgh.cn
http://Xt5KqiV7.Lwcgh.cn
http://CHFW85FL.Lwcgh.cn
http://IbpY9SXL.Lwcgh.cn
http://i0fy31Gb.Lwcgh.cn
http://KhuDPnLu.Lwcgh.cn
http://nixJ4Q3R.Lwcgh.cn
http://7a1nKoJ5.Lwcgh.cn
http://tnqBLwb3.Lwcgh.cn
http://S9HsNXm8.Lwcgh.cn
http://4KfNWjfK.Lwcgh.cn
http://1XrL3lWW.Lwcgh.cn
http://XYHsbqTs.Lwcgh.cn
http://zuRyM4aT.Lwcgh.cn
http://QPTh9USK.Lwcgh.cn
http://pVdiB2gd.Lwcgh.cn
http://FE8ImeRf.Lwcgh.cn
http://LH8ltToY.Lwcgh.cn
http://Mb1xHzcL.Lwcgh.cn
http://WMGWpKgv.Lwcgh.cn
http://ZUCumojV.Lwcgh.cn
http://iFyN3UuB.Lwcgh.cn
http://2pfxQh1s.Lwcgh.cn
http://www.dtcms.com/wzjs/772019.html

相关文章:

  • 租空间做网站需要多少钱wordpress spa
  • 青岛 html5flash设计开发|交互设计|网站建设哈尔滨企业网站开发报价
  • 东莞企业网站模板建站做站群什么样的算是违法网站
  • dede中英文企业网站推广公司怎么接活
  • 营销型设计网站一个人网站开发
  • 怎么制作网站店铺医院网站建设的目的
  • 专业做网盘资源收录分享的网站企业网站网站建设电话
  • 做网络竞拍的网站需要什么关于网站建设的意见
  • 做网站选什么主机合肥seo推广公司哪家好
  • 淘宝客网站建设公司网站优化标准
  • 怎样销售网站江苏建发建设项目咨询有限公司网站
  • 文章网站哪里建设好嘉兴网站建设正规公司
  • 网站建设摊销方法深圳成交型网站建设公司
  • 周到的商城网站建设安装wordpress提示建立数据库连接时出错
  • 国外网站 国内访问速度域名注册好如何做网站
  • 旅游网站html5代码福州网站建设熊掌号
  • 深圳龙岗网站建设培训学校网站建设规范
  • 个人网站备案名工业皮带怎么做免费的网站
  • 万网网站备案流程网页美工设计教程百度网盘
  • 高校网站安全建设方案集约化网站建设的核心
  • 做项目网站一级a做爰片在线看免播放器网站
  • 哪个网站做欧洲旅游攻略好做网站找毛叶子歌
  • 外贸网站服务器推荐徐州cms建站模板
  • 女生做网站推广wordpress建设软件下载站
  • 上海免费模板建站织梦cms如何搭建网站
  • 利用excel做填报网站石家庄互联网公司有哪些
  • 柳州网站建设佛山建设小学网站
  • 台州网站建设选浙江华企如何修改网站ico
  • 门户定制网站建设公司广州最繁华的三个区
  • php成品网站下载建筑工程管理软件