std::move和std::forward是C++0x中新增的标准库函数,分别用于实现移动语义和完美转发。
下面让我们分析一下这两个函数在gcc4.6中的具体实现。
预备知识
引用折叠规则:
X& + & => X&
X&& + & => X&
X& + && => X&
X&& + && => X&&
函数模板参数推导规则(右值引用参数部分):
当函数模板的模板参数为...
分类:
编程语言 时间:
2014-11-25 18:30:49
阅读次数:
1005
参考资料: http://www.cnblogs.com/lebronjames/p/3614773.html 左值和右值定义: C++( 包括 C) 中所有的表达式和变量要么是左值,要么是右值。通俗的左值的定义就是非临时对象(可以取地址,有名字),那些可以在多条语句中使用的对象。所有的变量都满足这...
分类:
编程语言 时间:
2014-11-18 00:18:03
阅读次数:
266
现在有这么几个结构体:typedef struct _info_head{ u_int src_ip; u_int dest_ip; u_int src_port; u_int dest_port;}info_head;typedef struct _pkt_info{ u_long sec; u....
分类:
编程语言 时间:
2014-11-13 07:00:01
阅读次数:
184
C++11 之后,C++的引用扩充为 非常量左值引用,常量左值引用,非常量右值引用,常量右值引用。什么是左值?什么是右值?左值、右值都是针对表达式而言的,左值是指表达式结束后依然存在的持久对象,右值是指表达式结束时就不存在的临时对象。一个区分左值、右值的便捷方法是:看能不能对表达式取地址,如果能,则...
分类:
编程语言 时间:
2014-11-12 16:18:38
阅读次数:
240
一直想试着把自己理解和学习到的右值引用相关的技术细节整理并分享出来,希望能够对感兴趣的朋友提供帮助。右值引用是C++11标准中新增的一个特性。右值引用允许程序员可以忽略逻辑上不需要的拷贝;而且还可以用来支持实现完美转发的函数。它们都是实现更高效、更健壮的库。move语义先不展开具体右值引用定义。先说...
分类:
编程语言 时间:
2014-11-01 06:12:29
阅读次数:
318
前面两节,说明了右值引用和它的作用。下面通过一个string类的编写,来说明右值引用的使用。 相对于C++98,主要是多了移动构造函数和移动赋值运算符。 先给出一个简要的声明: class String
{
public: String(); String(const char *s); //转化语...
分类:
编程语言 时间:
2014-10-17 21:40:15
阅读次数:
207
上节我们提出了右值引用,可以用来区分右值,那么这有什么用处? 问题来源 我们先看一个C++中被人诟病已久的问题: 我把某文件的内容读取到vector中,用函数如何封装? 大部分人的做法是: void readFile(const string &filename, vector &words)
{ ...
分类:
移动开发 时间:
2014-10-17 00:49:13
阅读次数:
352
C++98中规定了左值和右值的概念,但是一般程序员不需要理解的过于深入,因为对于C++98,左值和右值的划分一般用处不大,但是到了C++11,它的重要性开始显现出来。 C++98标准明确规定: 左值是可以取得内存地址的变量。 非左值即为右值。 从这里可以看出,可以执行&取地址的就是左值,其他的就是右...
分类:
编程语言 时间:
2014-10-16 23:37:53
阅读次数:
579
C++引用现在分为左值引用(能取得其地址)和右值引用(不能取得其地址)。其实很好理解,左值引用中的左值一般指的是出现在等号左边的值(带名称的变量,带*号的指针等一类的数据),程序能对这样的左值进行引用获得其地址;右值引用中的右值一般指的就是出现在等号右边的值(右值引用:常量、表达式、函数非左值引用的...
分类:
移动开发 时间:
2014-09-24 15:50:57
阅读次数:
258
1、右值引用引入的背景临时对象的产生和拷贝所带来的效率折损,一直是C++所为人诟病的问题。但是C++标准允许编译器对于临时对象的产生具有完全的自由度,从而发展出了Copy Elision、RVO(包括NRVO)等编译器优化技术,它们可以防止某些情况下临时对象产生和拷贝。下面简单地介绍一下Copy E...
分类:
编程语言 时间:
2014-09-21 01:09:39
阅读次数:
405