新的記憶體分配

2021-06-22 05:24:10 字數 2658 閱讀 2747

注意能力高於字串的長度!雖然我們的字串長度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...