字串複製的優化策略(C 實現)

2021-10-22 23:58:33 字數 3394 閱讀 3419

短字串優化(sso)

fbstring

淺拷貝只是拷貝記憶體空間,而深拷貝是拷貝記憶體空間的內容。

int

main()

scott meyers推薦我們,在真正需要乙個儲存空間時才去宣告變數(分配記憶體),這樣會得到程式在執行時最小的記憶體花銷。寫時複製(copy-on- write)技術,是程式設計界「懶惰行為」——拖延戰術的產物。c++曾在效能問題上被廣泛地質疑和指責過,為了提高效能,stl中的許多類都採用了copy-on-write技術。這種偷懶的行為的確使用stl的程式有著比較高的效能。

copy-on-write一定使用了「引用計數」,必然有乙個變數類似於ref_count。當第乙個string物件str1構造時,string的建構函式會根據傳入的引數從堆上分配記憶體。當有其它string物件複製str1時,這個ref_count會自動加1;當有物件析構時,這個計數會減1;直到最後乙個物件析構時,ref_count為0。此時,程式才會真正的釋放這塊從堆上分配的記憶體。

#include

#include

//用到字串的操作

#include

//用到printf

using

namespace std;

#define sizeof_int sizeof(int)

class

string

char

&operator=(

const

char

& ch)

;friend ostream &

operator

<<

(ostream & os,

const charproxy & rhs)

;private

: size_t m_index;

string & m_str;};

public

:string()

;~string()

;string

(const

char*)

;string

(const string & rhs)

; string &

operator=(

const string & rhs)

;const

char

&operator

(size_t index)

const

charproxy operator

(size_t index)

; size_t get_ref_count()

size_t size()

const

char

*c_str()

const

friend ostream &

operator

<<

(ostream & os,

const string & rhs)

;friend ostream &

operator

<<

(ostream & os,

const charproxy & rhs)

;private

:void

init_ref_count()

void

increase_ref_count()

void

decrease_ref_count()

void

release_ref_count()

}private

:char

* m_pstr;};

//過載string的輸出流運算子

ostream &

operator

<<

(ostream & os,

const string & rhs)

//過載charproxy的輸出流運算子

ostream &

operator

<<

(ostream & os,

const string::charproxy & rhs)

string::

string()

:m_pstr

(new

char

[sizeof_int +1]

())//前sizeof_int個位元組用於存放引用計數,最後1個位元組存放\0,下同

string::

string

(const

char

* pstr)

:m_pstr

(new

char

(strlen

(pstr)

+ sizeof_int +1)

)string::

string

(const string & rhs)

:m_pstr

(rhs.m_pstr)

string & string::

operator=(

const string & rhs)

return

*this

;//返回自身引用

}/*

* 下標訪問運算子無法區分是進行讀操作還是寫操作

* 所以在用的時候,都會進行深拷貝

* 我們用charproxy來區分讀操作和寫操作

* 1.讀操作用charproxy的《過載來實現

* 2.寫操作用string的過載和charproxy的=過載來實現

*/string::charproxy string::

operator

(size_t index)

char

& string::charproxy::

operator=(

const

char

& ch)

m_str.m_pstr[m_index]

= ch;

return m_str.m_pstr[m_index];}

string::

~string()

void

test1()

void

test2()

intmain()

在sso策略中,拷貝均是深拷貝,即立即複製字串。其優點是,當字串的位元組比較少的時候,直接將該字串存在棧中,而在棧上,開闢空間速度非常快。當字串的位元組較多時,才在堆上開闢空間。如:

int

main()

facebook的開源庫folly中的fbstring的實現採用了上述的三種方式:

0-23位元組用sso策略。儲存在棧緩衝區。

24-254位元組用深拷貝。儲存在堆空間。

大於254位元組的用寫時複製。

C語言 複製字串

include define length 128 char str copy char p,const char s return t int main void 也可將str copy 函式 char str copy char p,const char s return t 換成如下函式 ch...

複製字串

有一字串,包含 n個字元。寫一函式,將此字串中從第 m個字元開始的全部字元複製成為另乙個字串。數字n 一行字串數字m從 m開始的子串 6 abcdef 3 cdef 主函式已給定如下,提交時不需要包含下述主函式 c int main include include void strcpypos ch...

複製字串

time limit 1 sec memory limit 128 mb submit 164 solved 112 submit status web board 有一字串,包含n個字元。寫一函式,將此字串中從第m個字元開始的全部字元複製成為另乙個字串。數字n 一行字串數字m 從m開始的子串 6a...