2015-01-04 62 views
2

例如:C++如何爲輸入分配空間?

// is type: std::istream 
// str type: std::string 
is >> str; 

請問這個增長str,以適應輸入?它逐字符讀取並調用str.push_back()(或類似的東西)?或者在讀取輸入之前是否有機制知道輸入大小?


我意識到,標準最有可能沒有指定這個細節,但我更感興趣的是常見的實現(例如gcc)。

這個問題是一個好奇心在C你不事先知道多少來分配的字符串(當然字符的C風格的載體),但C++管理着你。

請注意,這不是關於C++管理動態存儲器的問題,但關於知道或不知道所讀取的輸入的大小將其讀入緩衝器/變量之前。在當然的情況下,如果str已經足夠大,不會發生重新分配,但這不是重點。

+0

通常,'std :: istream'有一些內部緩衝區。使用它,流可以確定需要插入哪個部分。然後它可以使用'append'之類的東西來自動增加大小並分配內存。 – justanothercoder

+0

@justanothercoder,我們達到了同樣的問題:你如何確定內部緩衝區的大小作爲輸入可以是理論上無限長? – bolov

+0

它的大小可以是任何。 'std :: istream'可以讀取輸入的一部分,看看我們是否看到空格或某些符號,表示我們應該停止插入。如果它沒有找到空間,它只是讀取輸入的下一部分,直到找到空間。順便說一句,如果它逐字符讀取,它相當於內部緩衝區的大小等於1。 – justanothercoder

回答

5

你可以找到libstdC++的實現here

正如你可以看到,它使用的128個字符數組作爲緩衝器,並順序地讀取字符到緩衝器直到緩衝器已滿或它到達字符串的末尾被讀取。如果緩衝區填滿,字符將被附加到字符串,緩衝區將被重用。因此,一次只能將128個字符附加到該字符串,除了可能在最後的附加操作期間。流確實無法知道預先將讀取多少個字符。字符串的內存分配策略不與流相耦合。