c++中引入了右值引用和移动语义,可以避免无谓的复制,提高程序性能。有点难理解,于是花时间整理一下自己的理解。 左值、右值 C++中所有的值都必然属于左值、右值二者之一。左值是指表达式结束后依然存在的持久化对象,右值是指表达式结束时就不再存在的临时对象。所有的具名变量或者对象都是左值,而右值不具名。 ...
分类:
移动开发 时间:
2019-06-02 20:34:11
阅读次数:
173
移动语义: push语句有时候会通过移动语义来提高性能 这样做的后果就是再也不能调用myEle了, 在push_back(const T&& val );这样的定义,可以这样: 在C++中emplace的意思就是 "放置到位"的意思。std::vector的方法有emplace_back();这个方 ...
分类:
其他好文 时间:
2019-02-14 19:06:16
阅读次数:
174
title: 右值引用与移动语义 date: 2019 2 24 15:06:34 tags: 学习 categories: 日常 什么是右值?在C++中,一种被广泛认可的说法是,不能取地址,没有名字的就是右值,通常位于等号右边,相反,位于等号左边的,能取地址,有名字的被称为左值。 例如上式中,a就 ...
分类:
编程语言 时间:
2019-02-04 15:25:36
阅读次数:
150
1、引用 C++中的引用主要用作函数的形参,接近于const指针,必须在创建时初始化。 以Person类为例,如下: Person p; //调用P的构造函数,创建对象P Person &p2 = p; //引用变量P2指向P Person p3 = p2; //P2是引用,创建一个p3的对象,会调 ...
分类:
移动开发 时间:
2019-01-31 00:17:06
阅读次数:
228
移动语义使得编译器得以使用成本较低的移动操作,来代替成本较高的复制操作;完美转发使得人们可以撰写接收任意实参的函数模板,并将其转发到目标函数,目标函数会接收到与转发函数所接收到的完全相同的实参。右值引用是将这两个不相关的语言特性连接起来的底层语言机制,正是它使得移动语义和完美转发成了可能。 23:理 ...
分类:
移动开发 时间:
2018-10-31 10:38:51
阅读次数:
199
C++ 已经拥有了拷贝构造函数, 和赋值函数,它们主要定位为浅和深度拷贝, 新增加一个移动构造函数,主要实现一个选择性重用临时对象。 编译器会对返回值进行优化,简称RVO,是编译器的一项优化技术,它涉及(功能是)消除为保存函数返回值而创建的临时对象。 -fno-elide-constructors, ...
分类:
移动开发 时间:
2018-09-30 13:02:58
阅读次数:
308
在C++11中,标准库在<utility>中提供了一个有用的函数std::move,这个函数的名字具有迷惑性,因为实际上std::move并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而我们可以通过右值引用使用该值,以用于移动语义。从实现上讲,std::move基本等同于一个类型 ...
分类:
其他好文 时间:
2018-08-05 14:18:42
阅读次数:
308
右值引用 右值定义: 通俗来讲,赋值号左边的就是左值,赋值号右边的就是右值。可以取地址是左值,不可以取地址的是右值。C++11,之前没有明确提出右值的概念,所以 C++11 以前这些说活都是正确的。 C++11 中的左值,仍然等同于 C++98 左值。C++11 中的右值,除了 C++98 中的右值 ...
分类:
移动开发 时间:
2018-07-15 14:53:40
阅读次数:
214
这周都在学《C++ Primer》 陈硕那篇文章说得太对了。 最重要的就是写类: 拷贝控制(含移动语义)、 动态内存(几种智能指针) 模板类/ 模板函数 OO机制(继承/多态) + “动态数组”: 用allocator实现vector p.s. 如果没有智能指针提供的这种“引用计数”:最后一个指针清 ...
分类:
其他好文 时间:
2018-07-02 11:01:07
阅读次数:
133
什么是左值、右值 最常见的误解:等号左边的就是左值,等号右边的就是右值左值和右值都是针对表达式而言的,左值是指表达式结束后依然存在的持久对象右值是指表达式结束时就不再存在的临时对象区分:能对表达式进行取地址,则为左值 否则为右值 为什么引入右值引用?std::vector<String> v;v.p ...
分类:
移动开发 时间:
2018-06-26 00:41:45
阅读次数:
236