国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

深入理解C/C++中的寫時拷貝

2020-05-23 13:49:24
字體:
來源:轉載
供稿:網友

color: #ff0000">寫時拷貝

何為寫時拷貝? 前面我說過深拷貝淺拷貝,今天我們來探究一下寫時拷貝。深拷貝是補充了淺拷貝的不足,寫時拷貝其實也就是補充一點深拷貝的不足。其實寫時拷貝的意思就是: 當你讀取到這個空間的時候,并不會開辟出一個一模一樣的空間出來給你,當你真正需要拷貝的時候,那么他就會開辟出空間給你。也就是拖延版的深拷貝。

c,深拷貝,拷貝文件夾,拷貝構造函數

寫時拷貝技術是通過"引用計數"實現的,在分配空間的時候多分配4個字節,用來記錄有多少個指針指向塊空間,當有新的指針指向這塊空間時,引用計數加一,當要釋放這塊空間時,引用計數減一(假裝釋放),直到引用計數減為0時才真的釋放掉這塊空間。當有的指針要改變這塊空間的值時,再為這個指針分配自己的空間(注意這時引用計數的變化,舊的空間的引用計數減一,新分配的空間引用計數加一)。

c,深拷貝,拷貝文件夾,拷貝構造函數

寫時拷貝的實用:實現一個string類

class String { public:  String(const char *str = "")  :_str(new char[strlen(str) + 1 + 4])  {  cout << "Sring()" << endl;  _str += 4;    //前4個字節用來存放引用計數  GetCount() = 1;   //引用計數的初始值設置成1  strcpy(_str, str);  }   String(String& s)  :_str(s._str)  {  cout << "Sring(String&)" << endl;  GetCount()++;  }   String& operator=(String& s)  {  cout << "Sring& operator=" << endl;   if (this != &s)  {   Release();   _str = s._str;   GetCount()++;  }  return *this;  }   ~String()  {  cout << "~Sring()" << endl;  Release();  } public:  char& operator[](size_t index)  {  if (GetCount() == 1)   //如果計數器為1,則直接返回  {   return _str[index];  }  GetCount()--;  char *tmp = _str;  _str = new char[strlen(tmp) + 1 + 4];  _str += 4;  strcpy(_str, tmp);  GetCount() = 1;  return _str[index];  } private:  int& GetCount()  {  return *(int *)(_str - 4);  }  void Release()  {  if (--GetCount() == 0)  {   cout << "釋放" << endl;   delete[](_str - 4); //注意釋放的時候還有 存放引用計數的4個字節   _str = NULL;  }  } private:  char *_str; }; 

這里有一個問題呢~,C++標準的確就是這樣的,C++標準認為,當你通過迭代器或[]獲取到string的內部地址的時候,string并不知道你將是要讀還是要寫。這是它無法確定,為此,當你獲取到內部引用后,為了避免不能捕獲你的寫操作,它在此時廢止了寫時才拷貝技術。

這樣看來我們在使用寫時拷貝的時候,一定要注意,如果你不需要對string的內部進行修改,那你就千萬不要使用通過[]操作符和迭代器去獲取字符串的內部地址引用,如果你一定要這么做,那么你就必須要付出代價。當然,string還提供了一些使迭代器和引用失效的方法。比如說push_back,等, 你在使用[]之后再使用迭代器之后,引用就有可能失效了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 石嘴山市| 洛浦县| 常山县| 塔河县| 桦甸市| 彭阳县| 兰西县| 郧西县| 蒲江县| 庆元县| 定边县| 乡宁县| 蒙阴县| 龙州县| 钟山县| 鹿邑县| 繁昌县| 德令哈市| 蓬溪县| 金川县| 扶绥县| 大港区| 湘潭县| 武义县| 黄大仙区| 松江区| 宣汉县| 桃园市| 黄石市| 塔河县| 卓资县| 静乐县| 司法| 海城市| 泰顺县| 肇源县| 定日县| 环江| 新沂市| 茂名市| 延川县|