欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入探究C++ string的內(nèi)部究竟是什么樣的

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

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

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

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

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

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

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

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

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

特別是,C++ 標準沒有定義在哪種確切的情況下應該為 string 對象分配內(nèi)存空間來存儲字符序列。string 內(nèi)存分配規(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 下的運行結(jié)果:

1
s1 = 62345
s2 = 12345
0

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

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

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

相關(guān)文章

  • QT實現(xiàn)按鈕開關(guān)Form窗體的效果的示例代碼

    QT實現(xiàn)按鈕開關(guān)Form窗體的效果的示例代碼

    本文主要介紹了QT實現(xiàn)按鈕開關(guān)Form窗體的效果的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • C語言中#pragma?pack(1)的用法與注意點

    C語言中#pragma?pack(1)的用法與注意點

    #pragma用于指示編譯器完成一些特定的動作,下面這篇文章主要給大家介紹了關(guān)于C語言中#pragma?pack(1)的用法與注意點的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • C語言scandir函數(shù)獲取文件夾內(nèi)容的實現(xiàn)

    C語言scandir函數(shù)獲取文件夾內(nèi)容的實現(xiàn)

    scandir?函數(shù)用于列舉指定目錄下的文件列表,本文主要介紹了C語言scandir函數(shù)獲取文件夾內(nèi)容的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • C++模擬實現(xiàn)STL容器vector的示例代碼

    C++模擬實現(xiàn)STL容器vector的示例代碼

    這篇文章主要為大家詳細介紹了C++如何模擬實現(xiàn)STL容器vector的相關(guān)資料,文中的示例代碼講解詳細,對我們學習C++有一定幫助,需要的可以參考一下
    2022-11-11
  • C語言的分支和循環(huán)語句你了解嗎

    C語言的分支和循環(huán)語句你了解嗎

    這篇文章主要為大家詳細介紹了C語言的分支和循環(huán)語句,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++深入細致探究二叉搜索樹

    C++深入細致探究二叉搜索樹

    二叉搜索樹是以一棵二叉樹來組織的。每個節(jié)點是一個對象,包含的屬性有l(wèi)eft,right,p和key,其中,left指向該節(jié)點的左孩子,right指向該節(jié)點的右孩子,p指向該節(jié)點的父節(jié)點,key是它的值
    2022-05-05
  • Visual Studio C++指針靠前靠后的問題全面解析

    Visual Studio C++指針靠前靠后的問題全面解析

    這篇文章主要介紹了Visual Studio C++指針靠前靠后的問題全面解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • C語言多種方法實現(xiàn)一個函數(shù)左旋字符串中K個字符

    C語言多種方法實現(xiàn)一個函數(shù)左旋字符串中K個字符

    這篇文章主要為大家介紹了C語言多種方法實現(xiàn)一個函數(shù),可以左旋字符串中K個字符,文中附含詳細的示例講解,有需要的朋友可以借鑒參考下
    2021-10-10
  • C語言新手入門速通手冊

    C語言新手入門速通手冊

    C 語言是一種通用的、面向過程式的計算機程序設計語言。1972 年,為了移植與開發(fā) UNIX 操作系統(tǒng),丹尼斯·里奇在貝爾電話實驗室設計開發(fā)了 C 語言。C 語言是一種廣泛使用的計算機語言,它與 Java 編程語言一樣普及,二者在現(xiàn)代軟件程序員之間都得到廣泛使用
    2022-04-04
  • C++用read()和write()讀寫二進制文件的超詳細教程

    C++用read()和write()讀寫二進制文件的超詳細教程

    二進制的文件肉眼我們是讀不懂的,如果通過二進制的讀寫操作就可以讀懂,下面這篇文章主要給大家介紹了關(guān)于C++用read()和write()讀寫二進制文件的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06

最新評論