2014-09-22 39 views
3

當使用std::string對象並且我想給它添加字符時,它是否會預先分配一些內存,還是隻根據需要分配?什麼時候std :: string重新分配內存?

準確地說:

std::string s; 
s.reserve(20); 
char c = 'a'; 
s = ""; 
for(int i = 0; i < 25; i++) 
    s += c; 

在上述例子中我保留的存儲器的量。現在,當我清除字符串時,是否會導致保留的內存被丟棄? 在循環中它會填滿保留的內存,然後每次重新分配額外的5個字符?

+2

除非應用「適合縮小」方法之一,否則將保留保留的內存。 – Niall 2014-09-22 12:27:10

回答

3

當您爲其分配空字符串時,沒有要求std::string版本分配內存。當你給它分配一個短的字符串。唯一的要求是,當它分配內存來保存更大的字符串時,必須以達到分攤的恆定時間的方式完成分配。每次需要更多空間時,一個簡單的實施將會增加2倍。

如果希望字符串的容量最小化,可以在C++ 11中使用string::shrink_to_fit()。在C++ 11之前,有些人在需要降低容量時採取了「交換技巧」。

+0

需要'std :: string' _not_釋放分配的內存,除了極少數特殊情況外;我不認爲分配就是其中之一。並且沒有要求'std :: string :: push_back'具有分期固定時間。 – 2014-09-22 14:34:21

+0

下面是一個答案,它解釋了push_back確實具有分期固定的時間。你能否以更權威的來源駁斥它? http://stackoverflow.com/a/13893031/4323 – 2014-09-22 14:36:18

+1

標準。 'basic_string'沒有時間保證。顯然,我不能引用那些不存在的東西,但因爲它不存在,所以沒有保證(第21節中的任何地方都沒有「攤銷」一詞)。有趣的是,表101提到了'std :: basic_string'然而,在標準中的其他位置,它明確表示它們不是序列容器。 DR可能是有序的。 – 2014-09-22 17:47:35

0

不,reserve d內存不會被丟棄,swap帶有一個空對象。

是的,當您的reserve空間已滿時,下一個append,將導致重新分配。

1

string不「記住」你說的20個字符,它只知道它的當前容量。所以你的reserve(20)呼叫將容量增加到至少20,並沒有進一步的影響。

向字符串添加25個字符時,容量增加至少25。然後它會保持在這個新的水平,除非你做了一些能夠降低容量的東西。調用clear()不會改變容量。