最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++寫時拷貝實現(xiàn)原理及實例解析

 更新時間:2020年06月25日 12:23:48   作者:知道了呀~  
這篇文章主要介紹了C++寫時拷貝實現(xiàn)原理及實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

一、什么是寫時拷貝

寫入時復(fù)制是一種計算機程序設(shè)計領(lǐng)域的優(yōu)化策略。其核心思想是,如果有多個調(diào)用者同時請求相同資源(如內(nèi)存或磁盤上的數(shù)據(jù)存儲),他們會共同獲取相同的指針指向相同的資源,直到某個調(diào)用者試圖修改資源的內(nèi)容時,系統(tǒng)才會真正復(fù)制一份專用副本(private copy)給該調(diào)用者,而其他調(diào)用者所見到的最初的資源仍然保持不變。
這個過程對其他的調(diào)用者是透明的(transparently)。

此作法的主要優(yōu)點是如果調(diào)用者沒有修改該資源,就不會有副本被建立,因此多個調(diào)用者只是讀取操作是可以共享同一份資源。

寫時拷貝技術(shù)是一種很重要的優(yōu)化手段,核心是懶惰處理實體資源請求,在多個實體資源之間只是共享資源,起初是并不真正實現(xiàn)資源拷貝,

只有當(dāng)實體有需要對資源進(jìn)行修改時才真正為實體分配私有資源。但寫時拷貝技術(shù)技術(shù)也有它的優(yōu)點和缺點:

1、寫時拷貝技術(shù)可以減少分配和復(fù)制大量資源時帶來的瞬間延時,但實際上是將這種延時附加到了后續(xù)的操作之中。

2、寫時拷貝技術(shù)可以減少不必要的資源分配。比如fork進(jìn)程時,并不是所有的頁面都需要復(fù)制,父進(jìn)程的代碼段和只讀數(shù)據(jù)段都不被允許修改,所以無需復(fù)制。

二、寫時拷貝技術(shù)的應(yīng)用

1、虛擬內(nèi)存管理中的寫時復(fù)制

一般把這種被共享訪問的頁面標(biāo)記為只讀。當(dāng)一個task試圖向內(nèi)存中寫入數(shù)據(jù)時,內(nèi)存管理單元(MMU)拋出一個異常,內(nèi)核處理該異常時為該task分配一份物理內(nèi)存并復(fù)制數(shù)據(jù)到此內(nèi)存,

重新向MMU發(fā)出執(zhí)行該task的寫操作。

比如Linux的fork()使用寫時拷貝頁來實現(xiàn)新進(jìn)程的創(chuàng)建,它是一種可推遲甚至避免數(shù)據(jù)拷貝的技術(shù),開始時內(nèi)核并不會復(fù)制整個地址空間,而是讓父子進(jìn)程共享地址空間,只有在寫時才復(fù)制地址空間,使得父子進(jìn)程都擁有獨立的地址空間,即資源的復(fù)制是在只有需要寫入時才會發(fā)生。在此之前都是以讀的方式去和父進(jìn)程共享資源,這樣,在頁根本不會被寫入的場景下,fork()立即執(zhí)行exec(),無需對地址空間進(jìn)行復(fù)制,fork()的實際開銷就是復(fù)制父進(jìn)程的一個頁表和為子進(jìn)程創(chuàng)建一個進(jìn)程描述符,也就是說只有當(dāng)進(jìn)程空間中各段的內(nèi)存內(nèi)容發(fā)生變化時,父進(jìn)程才將其內(nèi)容復(fù)制一份傳給子進(jìn)程,大大提高了效率。

2、數(shù)據(jù)存儲中的寫時復(fù)制

  Linux等的文件管理系統(tǒng)使用了寫時復(fù)制策略。

  舉個例子,比如我們有個程序要寫文件,不斷地根據(jù)網(wǎng)絡(luò)傳來的數(shù)據(jù)寫,如果每一次fwrite或是fprintf都要進(jìn)行一個磁盤的I/O操作的話,都簡直就是性能上巨大的損失,

  因此通常的做法是,每次寫文件操作都寫在特定大小的一塊內(nèi)存中(磁盤緩存),只有當(dāng)我們關(guān)閉文件時,才寫到磁盤上(這就是為什么如果文件不關(guān)閉,所寫的東西會丟失的原因)

3、軟件應(yīng)用中的寫時復(fù)制

在我們經(jīng)常使用的STL標(biāo)準(zhǔn)模板庫中的string類,也是一個具有寫時才拷貝技術(shù)的類。為了提高性能,STL中的許多類都采用了寫時拷貝技術(shù)。但是在C++11標(biāo)準(zhǔn)中為了提高并行性取消了這一策略

class String
{
public:
  //構(gòu)造函數(shù)(分存內(nèi)存)
  String(char* tmp)
  {
    _Len = strlen(tmp);
    _Ptr = new char[_Len + 1 + 1];
    strcpy(_Ptr, tmp);
    // 在數(shù)組尾部設(shè)置引用計數(shù)
    _Ptr[_Len + 1] = 0; 
  }
  //析構(gòu)函數(shù)
  ~String()
  {
    //引用計數(shù)減一
    _Ptr[_Len + 1]--; 
    // 引用計數(shù)為0時,釋放內(nèi)存
    if (_Ptr[_Len + 1] == 0)
    {
      delete[] _Ptr;
    }
  }

  //拷貝構(gòu)造(共享內(nèi)存)
  String(string& str)
  {
    if (this->_Ptr != str)
    {
      //共享內(nèi)存,.data()返回的是將string的類型轉(zhuǎn)換成char類型的指針
      const char *p = str.c_str();
      char* pp;
      strcmp(pp, p);
      this->_Ptr = pp; 
      this->_Len = str.size();
      this->_Ptr[_Len + 1] ++; //引用計數(shù)加一

    }
  }

  //對[]符進(jìn)行重載,對字符串進(jìn)行操作的時候,開始寫時復(fù)制
  char& operator[](unsigned int idx)
  {
    if (idx > _Len || _Ptr == 0)
    {
      static char nullchar = 0;
      return nullchar;
    }
    //引用計數(shù)減一
    _Ptr[_Len + 1]--; 

    char* tmp = new char[_Len + 1 + 1];

    strncpy(tmp, _Ptr, _Len + 1);

    _Ptr = tmp;
    // 設(shè)置新的共享內(nèi)存的引用計數(shù)
    _Ptr[_Len + 1] = 0; 
    return _Ptr[idx];
  }

private:
  int _Len;
  char* _Ptr;
};

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何通過C++在Bing搜索引擎上進(jìn)行命令行搜索

    如何通過C++在Bing搜索引擎上進(jìn)行命令行搜索

    這篇文章主要介紹了通過C++在Bing搜索引擎上進(jìn)行命令行搜索,在這篇文章中,我們將介紹一個簡單的C++程序,允許用戶通過命令行輸入搜索詞,在Bing搜索引擎上執(zhí)行搜索,并在默認(rèn)瀏覽器中顯示搜索結(jié)果,需要的朋友可以參考下
    2023-12-12
  • 利用c++編寫簡易版2048小游戲

    利用c++編寫簡易版2048小游戲

    這篇文章主要介紹了如何讓利用c++編寫簡易版的2048小游戲,感興趣的小伙伴請參考下面文章的具體內(nèi)容
    2021-09-09
  • String類的寫時拷貝實例

    String類的寫時拷貝實例

    下面小編就為大家?guī)硪黄猄tring類的寫時拷貝實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 簡單講解c++ vector

    簡單講解c++ vector

    這篇文章主要介紹了c++ vector的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-09-09
  • 在C語言里單引號和雙引號的區(qū)別

    在C語言里單引號和雙引號的區(qū)別

    這篇文章主要介紹了在C語言里單引號和雙引號的區(qū)別,本文通過代碼的實例和注釋的詳細(xì)的說明了單引號和雙引號的概念與區(qū)別,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言開發(fā)之歸并排序詳解及實例

    C語言開發(fā)之歸并排序詳解及實例

    這篇文章主要介紹了 C語言開發(fā)之歸并排序詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 通過C++獲取CPU占用率的代碼示例(windows、linux、macOS)

    通過C++獲取CPU占用率的代碼示例(windows、linux、macOS)

    本文介紹了在Windows、Linux和macOS平臺下使用C++獲取CPU占用率的多種方法,包括系統(tǒng)整體CPU占用率和特定進(jìn)程CPU占用率的計算公式和實現(xiàn)代碼示例,需要的朋友可以參考下
    2025-03-03
  • C++使用string的大數(shù)除法運算(4)

    C++使用string的大數(shù)除法運算(4)

    這篇文章主要為大家詳細(xì)介紹了C++使用string的大數(shù)除法運算,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • QT圓形圖像剪切功能實現(xiàn)

    QT圓形圖像剪切功能實現(xiàn)

    這篇文章主要介紹了QT圓形圖像剪切,實現(xiàn)代碼包括剪切代碼,完整QML源碼,C++代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • C++中漢字字符串的截取

    C++中漢字字符串的截取

    C++中漢字字符串的截取,需要的朋友可以參考一下
    2013-05-05

最新評論

金溪县| 弥渡县| 安庆市| 遂宁市| 手机| 安国市| 乡宁县| 深州市| 新河县| 武功县| 洪江市| 金湖县| 三河市| 治多县| 道孚县| 亳州市| 河东区| 察隅县| 南安市| 藁城市| 张家界市| 上林县| 明光市| 阿勒泰市| 二手房| 田林县| 和林格尔县| 文山县| 平舆县| 博乐市| 黄浦区| 天全县| 丰县| 马尔康县| 东辽县| 广元市| 库尔勒市| 卢湾区| 灵川县| 仁布县| 福鼎市|