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

深入探究C++ string的內部究竟是什么樣的

 更新時間:2021年01月05日 09:33:51   作者:RioTian  
這篇文章主要給大家介紹了關于C++ string的內部究竟是什么樣的,文中通過示例代碼的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在C語言中,有兩種方式表示字符串:

  • 一種是用字符數(shù)組來容納字符串,例如char str[10] = "abc",這樣的字符串是可讀寫的;
  • 一種是使用字符串常量,例如char *str = "abc",這樣的字符串只能讀,不能寫。

兩種形式總是以\0作為結束標志。

C++ string 與它們在C語言中的前身截然不同。首先,也是最重要的不同點,C++ string 隱藏了它所包含的字符序列的物理表示。程序設計人員不必關心數(shù)組的維數(shù)或\0方面的問題。

string 在內部封裝了與內存和容量有關的信息。具體地說,C++ string 對象知道自己在內存中的開始位置、包含的字符序列以及字符序列長度;當內存空間不足時,string 還會自動調整,讓內存空間增長到足以容納下所有字符序列的大小。

C++ string 的這種做法,極大地減少了C語言編程中三種最常見且最具破壞性的錯誤:

  • 數(shù)組越界;
  • 通過未被初始化或者被賦以錯誤值的指針來訪問數(shù)組元紊;
  • 釋放了數(shù)組所占內存,但是仍然保留了“懸空”指針。

C++ 標準沒有定義 string 類的內存布局,各個編譯器廠商可以提供不同的實現(xiàn),但必須保證 string 的行為一致。采用這種做法是為了獲得足夠的靈活性。

特別是,C++ 標準沒有定義在哪種確切的情況下應該為 string 對象分配內存空間來存儲字符序列。string 內存分配規(guī)則明確規(guī)定:允許但不要求以引用計數(shù)(reference counting)的方式實現(xiàn)。但無論是否采用引用計數(shù),其語義都必須一致。

C++ 的這種做法和C語言不同,在C語言中,每個字符型數(shù)組都占據(jù)各自的物理存儲區(qū)。在 C++ 中,獨立的幾個 string 對象可以占據(jù)也可以不占據(jù)各自特定的物理存儲區(qū),但是,如果采用引用計數(shù)避免了保存同一數(shù)據(jù)的拷貝副本,那么各個獨立的對象(在處理上)必須看起來并表現(xiàn)得就像獨占地擁有各自的存儲區(qū)一樣。例如:

// #include<bits/stdc++.h>
#include <iostream>
#include <string>
using namespace std;
 
int main() {
 string s1("12345");
 string s2 = s1;
 cout << (s1 == s2) << endl;
 s1[0] = '6';
 cout << "s1 = " << s1 << endl; // 62345
 cout << "s2 = " << s2 << endl; // 12345
 cout << (s1 == s2) << endl;
 
 return 0;
}

在 GCC 下的運行結果:

1
s1 = 62345
s2 = 12345
0

只有當字符串被修改的時候才創(chuàng)建各自的拷貝,這種實現(xiàn)方式稱為寫時復制(copy-on-write)策略。當字符串只是作為值參數(shù)(value parameter)或在其他只讀情形下使用,這種方法能夠節(jié)省時間和空間。

不論一個庫的實現(xiàn)是不是采用引用計數(shù),它對 string 類的使用者來說都應該是透明的。遺憾的是,情況并不總是這樣。在多線程程序中,幾乎不可能安全地使用引用計數(shù)來實現(xiàn)。

到此這篇關于C++ string的內部究竟是什么樣的的文章就介紹到這了,更多相關C++ string內部是什么內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言對冒泡排序進行升級介紹

    C語言對冒泡排序進行升級介紹

    大家好,本篇文章主要講的是C語言對冒泡排序進行升級介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 使用kendynet構建異步redis訪問服務

    使用kendynet構建異步redis訪問服務

    這篇文章主要介紹了在kendynet上寫的一個簡單的redis異步訪問接口,大家參考使用吧
    2014-01-01
  • C語言 main 函數(shù)詳情

    C語言 main 函數(shù)詳情

    這篇文章主要介紹C語言 main 函數(shù),文章將圍繞C語言 main 函數(shù)相關資料詳細展開,需要的朋友可以參考一下
    2021-10-10
  • C/C++?單元自動化測試解決方案總結

    C/C++?單元自動化測試解決方案總結

    這篇文章主要介紹了C/C++?單元自動化測試解決方案總結,通過利用GCC插件來實現(xiàn)提升C/C++開發(fā)者的單元效率工具解決方案,希望對大家在提升單元測試效率上有所啟發(fā)
    2022-06-06
  • C++關于Makefile的詳解含通用模板

    C++關于Makefile的詳解含通用模板

    今天小編就為大家分享一篇關于C++關于Makefile的詳解含通用模板,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C語言實現(xiàn)SM4加解密方式

    C語言實現(xiàn)SM4加解密方式

    這篇文章主要介紹了C語言實現(xiàn)SM4加解密方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 利用C++實現(xiàn)計算機輔助教學系統(tǒng)

    利用C++實現(xiàn)計算機輔助教學系統(tǒng)

    我們都知道計算機在教育中起的作用越來越大。這篇文章主要為大家詳細介紹了如何利用C++編寫一個計算機輔助教學系統(tǒng),感興趣的可以了解一下
    2023-05-05
  • C語言三子棋游戲的簡單設計

    C語言三子棋游戲的簡單設計

    這篇文章主要為大家詳細介紹了C語言三子棋游戲的簡單設計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C基礎 mariadb處理的簡單實例

    C基礎 mariadb處理的簡單實例

    下面小編就為大家?guī)硪黄狢基礎 mariadb處理的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • C++ const引用、臨時變量 引用參數(shù)詳解

    C++ const引用、臨時變量 引用參數(shù)詳解

    下面小編就為大家?guī)硪黄狢++ const引用、臨時變量 引用參數(shù)詳解。小編覺得挺不錯的現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01

最新評論

泉州市| 康马县| 孝感市| 栾川县| 桂东县| 融水| 平湖市| 和硕县| 上思县| 河东区| 铜梁县| 永昌县| 多伦县| 宁晋县| 定襄县| 七台河市| 随州市| 江油市| 昭通市| 汨罗市| 鹿邑县| 嘉祥县| 威海市| 宜宾市| 深圳市| 栖霞市| 梧州市| 奈曼旗| 竹北市| 金堂县| 成武县| 东阳市| 游戏| 建水县| 张家界市| 图们市| 宜兰市| 石城县| 波密县| 浏阳市| 永平县|