短字串優化(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...