首页 > 代码库 > C++11之右值引用、move语义
C++11之右值引用、move语义
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 =http://www.mamicode.com/ rhs.m_data; 16 m_len = rhs.m_len; 17 rhs.m_data =http://www.mamicode.com/ 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 = http://www.mamicode.com/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 =http://www.mamicode.com/ rhs.m_data; 49 rhs.m_data =http://www.mamicode.com/ 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语义
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。