2
// is type: std::istream
// str type: std::string
is >> str;
請問這個增長str
,以適應輸入?它逐字符讀取並調用str.push_back()
(或類似的東西)?或者在讀取輸入之前是否有機制知道輸入大小?
我意識到,標準最有可能沒有指定這個細節,但我更感興趣的是常見的實現(例如gcc
)。
這個問題是一個好奇心在C你不事先知道多少來分配的字符串(當然字符的C風格的載體),但C++管理着你。
請注意,這不是關於C++管理動態存儲器的問題,但關於知道或不知道所讀取的輸入的大小將其讀入緩衝器/變量之前。在當然的情況下,如果str
已經足夠大,不會發生重新分配,但這不是重點。
通常,'std :: istream'有一些內部緩衝區。使用它,流可以確定需要插入哪個部分。然後它可以使用'append'之類的東西來自動增加大小並分配內存。 – justanothercoder
@justanothercoder,我們達到了同樣的問題:你如何確定內部緩衝區的大小作爲輸入可以是理論上無限長? – bolov
它的大小可以是任何。 'std :: istream'可以讀取輸入的一部分,看看我們是否看到空格或某些符號,表示我們應該停止插入。如果它沒有找到空間,它只是讀取輸入的下一部分,直到找到空間。順便說一句,如果它逐字符讀取,它相當於內部緩衝區的大小等於1。 – justanothercoder