注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[c++11] std::move 和 std::forward  

2012-11-02 22:21:29|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

我们为了减少内存copy,经常会做如下的处理,比如网络buffer,上层逻辑malloc,填充好数据后,交给后台线程send,最后free。

p = malloc();
process_func(p) {
  // do with p
  free(p);
}

C++新标准希望每个class的instance在传递时,也能尽量减少内存copy,所以在copy ctor的概念上,继续引入复杂的东东。

右值构造

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
class FooString {
public:
  FooString(const char *s) {
    size_t n = strlen(s);
    s_ = (char *)malloc(n+1);
    memcpy(s_, s, n+1);
    printf("ctor: %s, %p\n", s, this);
  }
  FooString(const FooString& rhs) {
    size_t n = strlen(rhs.s_);
    s_ = (char *)malloc(n+1);
    memcpy(s_, rhs.s_, n+1);
    printf("copy ctor: %s, %p\n", s_, this);
  }
  FooString(FooString&& rhs) {
    s_ = rhs.s_;
    rhs.s_ = nullptr;
    printf("rval ctor: %p, %p\n", this, &rhs);
  }
  ~FooString() {
    if (s_)
      free(s_);
    printf("dtor: %p\n", this);
  }
private:
  char *s_;
};
FooString getValue(const char *v) {
  FooString a(v);
  return a;
}
int main() {
  FooString f1("hello");
  FooString f2 = getValue("foo");
  FooString f3 = std::move(getValue("bar"));
  return 0;
}

让class的使用者可以在某些时候减少内存copy,比如从一个函数中返回局部变量。
内部实现的细节,交给class的实现者考虑。看看执行结果:

ctor: hello, 004AFC50
ctor: foo, 004AFB20
rval ctor: 004AFC44, 004AFB20 # return a ("foo")
dtor: 004AFB20
ctor: bar, 004AFB20
rval ctor: 004AFB60, 004AFB20 # return a ("bar")
dtor: 004AFB20
rval ctor: 004AFC38, 004AFB60 # f3 = std::move ...
dtor: 004AFB60
dtor: 004AFC38
dtor: 004AFC44
dtor: 004AFC50

利用 std::move() 可以告诉编译器,启用 rvalue ctor

FooString f2 = f1; # copy ctor
FooString f3 = std::move(f1); # rvalue ctor

 
而对于 std::forward() ,简单理解,就是用来在写 template 的时候,可以将右值往下一层 template 去传递。

vector(_Myt&& _Right) : _Mybase(_Right._Alval)
{ // construct by moving _Right
  _Assign_rv(std::forward<_Myt>(_Right));
}

 
参考:

http://blog.csdn.net/zwvista/article/details/6848582
http://www.cnblogs.com/cbscan/archive/2012/01/10/2318482.html
  评论这张
 
阅读(2239)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017