码迷,mamicode.com
首页 > 编程语言 > 详细

C++11之右值引用、move语义

时间:2016-11-24 08:14:09      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:code   bsp   this   std   void   char   main   移动语义   cto   

  C++11中增加了一个新的类型,即右值引用(R-value reference),标记为T&& 。而它的目的就是去消除不必要的深拷贝,提高性能。

  概念性的东西就不多说了。直接用代码体现其优势。

  实现一个MyString类:

 1 class MyString {
 2 public:
 3     MyString():m_data(nullptr), m_len(0) {}
 4     MyString(const char* p) {
 5         m_len = strlen(p);
 6         copy_data(p);
 7         std::cout << " Construction Called" << std::endl;
 8     }
 9     MyString(const MyString& lhs) {
10         m_len = lhs.m_len;
11         copy_data(lhs.m_data);
12         std::cout << "Copy Construction Called" << std::endl;
13     }
14     MyString(MyString&& rhs) {
15         m_data = rhs.m_data;
16         m_len = rhs.m_len;
17         rhs.m_data = nullptr;
18         rhs.m_len = 0;
19         std::cout << "Move Construction Called" << std::endl;
20     }
21     MyString& operator=(const MyString&);
22     MyString& operator=(MyString&&);
23     void Print();
24 private:
25     void copy_data(const char* s) {
26         m_data = new char[m_len + 1];
27         strncpy(m_data, s, m_len);
28         m_data[m_len] = 0;
29     }
30 private:
31     char* m_data;
32     size_t m_len;
33 };
34 
35 MyString& MyString::operator=(const MyString& lhs) {
36     if (this != &lhs) {
37         m_len = lhs.m_len;
38         copy_data(lhs.m_data);
39     }
40 
41     std::cout << "Copy Assignment Called" << std::endl;
42     return *this;
43 }
44 
45 MyString& MyString::operator=(MyString&& rhs) {
46     if (this != &rhs) {
47         m_len = rhs.m_len;
48         m_data = rhs.m_data;
49         rhs.m_data = nullptr;
50         rhs.m_len = 0;
51     }
52     std::cout << "Move Assignment Called" << std::endl;
53     return *this;
54 }
55 void MyString::Print() {
56     std::cout << "value:" << m_data << std::endl;
57 }

  move语义是用来将左值转换为右值,这样的目的只是改变了对象的控制权而并没有内存拷贝,从而提高效率。

1 std::vector<std::string> v1;
2 std::vector<std::string> v2 = std::move(v1);

  std::forward 方法用于函数转发,它能按照参数原来的类型转发到另一个函数。STL中的所有容器都实现了基于移动语义的方法 emplace, emplace_front, emplace_back, emplace_after等,如:

int main(int argc, char** argv) {
    std::vector<int> v = {1, 2, 3, 4};
    v.emplace_back(5);
    v.emplace(v.begin(), 0);
    for_each(v.begin(), v.end(), [](int value) {
        std::cout << value << endl;
    });
    system("pause");
    return 0;
}

 

C++11之右值引用、move语义

标签:code   bsp   this   std   void   char   main   移动语义   cto   

原文地址:http://www.cnblogs.com/graves/p/6095590.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!