2013-09-25 105 views
3

我在C++中有這個片段。C++字符串中的「大小」和「容量」之間的區別?

#include <iostream> 
#include <string> 

int main() 
{ 
string bigNews("I saw Elvis in a UFO. "); 
cout << bigNews << endl; 
bigNews.insert(0, " thought I "); 
cout << bigNews << endl; 
cout << "Size = " << bigNews.size() << endl; 
cout << "Capacity = " 
<< bigNews.capacity() << endl; 
bigNews.append("I've been working too hard."); 
cout << bigNews << endl; 
cout << "Size = " << bigNews.size() << endl; 
cout << "Capacity = " 
<< bigNews.capacity() << endl; 
    return 0; 
} 

而且我得到的輸出如下圖所示:

I saw Elvis in a UFO. 
thought I I saw Elvis in a UFO. 
Size = 33 
Capacity = 44 
thought I I saw Elvis in a UFO. I've been working too hard. 
Size = 60 
Capacity = 88 

我可以計算出尺寸增大的原因,但我不能夠做出來怎麼容量增大?

我知道的是容量是字符串緩衝區,我們可以推送,但如何分配空間?

+0

只要滿足該類的複雜性要求,就不能保證以任何特定方式進行分配。 – chris

回答

7

capacity是字符串當前可以容納的最大字符數,而不必增長。 size是字符串中實際存在多少個字符。他們分離概念的原因是分配內存通常效率低下,因此您嘗試通過獲取比實際需要的內存更少的內存來分配內存。 (許多數據結構使用一個「倍增」的方法在哪裏,如果他們打他們的N能力,並需要更多的空間,他們將分配2*N空間,以避免再次任何時間很快重新分配。)

capacity會自動增加爲您使用該字符串並需要更多空間。您也可以使用reserve函數手動增加它。

3

documentation

capacity()

返回一個可以在當前分配的存儲 (公共成員函數)

所以舉行的字符數,它是分配內部緩衝區的大小。你看到的是當它耗盡時它的大小加倍 - 這是一種常用的技術,可以有效地使用動態大小的緩衝區,這就是所謂的「指數存儲擴展」。是什麼把它歸結爲基本上是這樣的:

void resize_buffer(char **buf, size_t *cap, size_t newsize) 
{ 
    while (newsize > *cap) 
     *cap *= 2; 

    *buf = realloc(*buf, *cap); 
} 

(當然,這大大簡化,不使用此在生產實際重新分配代碼)可能是你的std::string實現使用這一招,這就是爲什麼你會看到緩衝區大小增加了100%。

+0

對於'realloc'的不安全使用,這值得-1。請修復它。 – DanielKO

+4

@DanielKO你不能認真對待我不知道這一點。顯然,這只是爲了演示目的,而不是爲了實際實施。如果我按照原樣「修復」了所有錯誤,它會要求我重新實現一個完整的緩衝區重新分配函數,這個函數很難(realloc()的正確用法並不是唯一的問題), 2.它會完全失去它的目的,即它應該是可讀的,以便向OP解釋發生了什麼。所以不,我沒有解決它。 – 2013-09-25 05:15:10

相關問題