标签: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; }
标签:code bsp this std void char main 移动语义 cto
原文地址:http://www.cnblogs.com/graves/p/6095590.html