注意能力高於字串的長度!雖然我們的字串長度8、15個字元的字串實際上分配足夠的記憶體!為什麼這是做了什麼?
最重要的認識是,如果使用者希望把更多的角色比字串有能力成乙個字串,該字串必須重新分配乙個更大的容量。例如,如果乙個字串長度和容量8,然後新增任何字元字串將迫使重新分配。通過能力大於實際的字串,這給使用者一些緩衝的空間擴大字串之前需要進行重新分配。
事實證明,重新分配是不好的幾個原因:
首先,重新分配乙個字串是相對昂貴的。首先,必須新的記憶體分配。然後字串中的每個字元必須複製到新的記憶體。這可能需要很長時間如果字串是大的。最後,舊的記憶已經被收回。如果你正在做許多reallocations,這個過程可以顯著延緩你的程式。
第二,無論何時重新分配乙個字串,字串的內容改變到乙個新的記憶體位址。這意味著所有引用、指標和迭代器的字串變成無效!
注意,並非總是如此,字串將被分配能力大於長度。考慮下面的程式:
1
2
3
string sstring(
"0123456789abcde"
);
cout <<
"length: "
<< sstring.length() << endl;
cout <<
"capacity: "
<< sstring.capacity() << endl;
這個程式輸出:
長度:15
能力:15
(結果可能取決於編譯器)。
讓我們新增乙個字元字串和觀察的能力改變:
1
2
3
4
5
6
7
8
string sstring(
"0123456789abcde"
);
cout <<
"length: "
<< sstring.length() << endl;
cout <<
"capacity: "
<< sstring.capacity() << endl;
// now add a new character
sstring +=
"f"
;
cout <<
"length: "
<< sstring.length() << endl;
cout <<
"capacity: "
<< sstring.capacity() << endl;
長度:15
能力:15
長度:16
容量:31
空字串:儲備()
空字串::儲備(size_type unsize)
第二味這個函式集的容量字串至少unsize(它可以更大)。請注意,這可能需要重新分配。
如果第乙個味道的函式被呼叫時,或者第二個味道叫做unsize不到目前的能力,該函式將試圖收縮能力匹配長度。這是乙個不具約束力的請求。
示例**:
意見與反饋
翻譯結
1
2
3
4
5
6
7
8
9
10
11
string sstring(
"01234567"
);
cout <<
"length: "
<< sstring.length() << endl;
cout <<
"capacity: "
<< sstring.capacity() << endl;
sstring.reserve(200);
cout <<
"length: "
<< sstring.length() << endl;
cout <<
"capacity: "
<< sstring.capacity() << endl;
sstring.reserve();
cout <<
"length: "
<< sstring.length() << endl;
cout <<
"capacity: "
<< sstring.capacity() << endl;
記憶體的分配
malloc 動態從記憶體中申請乙個空間 如果申請成功,將返回這個空間的首位址 通過乙個指標接受這個空間的首位址 int p p malloc sizeof int p 234 free p 釋放這個動態申請的空間 1.結構體的定義 struct 結構體名 struct npc 2.建立結構體變數 ...
記憶體的分配
需要使用 include include include 呼叫malloc函式所需的標頭檔案 intmain printf you number is n for i 0 i 1 不同機器對於各型別大小定義不同,因此最好使用sizeof 函式求型別大小 free 釋放引數指向的記憶體空間 函式原型 ...
記憶體分配 Go記憶體管理 記憶體分配一
go作為乙個比較新晚 新 的語言,自然借鑑前輩們的優點,比如說語言本身負責記憶體管理 對協程和高併發的高優支援 簡單高效的語法等。本篇及後續的幾篇要講的就是還沒提到的比較複雜的記憶體管理。學習記憶體管理 分配 前,如果有jvm的記憶體管理的基礎,會變得非常簡單,如果是第一次接觸記憶體管理,在看完go...