std::basic_string
具有以下構造函數初始化與空值終止字符串的內容指向的字符串s
:std :: basic_string構造函數如何事先知道要預留多少空間?
std::basic_string(const CharT* s, const Allocator& alloc = Allocator());
但如何構造事先知道有多少空間保留在串中的內部緩衝區?
我能想到的方法有兩種:
1)它可以先通過全空值終止字符串,直到它找到第一個NULL字符,記得有多少個字符走過,並用其作爲容量爲其內部緩衝區並開始複製。
缺點:它必須讀取字符串兩次,一次用於計數字符,第二次用於複製字符串。
2)它可以在其內部緩衝區保留一個保守的數量,並開始複製。如果它在緩衝區用完之前遇到NULL字符,那麼我們就可以,否則我們需要預留更多空間(再次保守一些),然後重複這些步驟。
缺點:如果字符串相當大,不斷重新調整容量的開銷可能會變得很明顯。
那麼,一個理智的std :: basic_string實現是做什麼的(或者甚至是在標準中指定的)?
你爲什麼問? –
2並不像您想象的那樣糟糕,通過將每個展開式展開的空間加倍(這是相當標準的做法),您可以獲得指數級的增長,這通常足以限制性能問題。老實說,你錯過了一個混合的方法:做2直到你確定字符串太大,然後切換到1. – IdeaHat
@MadScienceDreams:2比1差太多了。幾何增長方法會造成空間浪費,單個內存分配的成本將超出計算字符串的成本以計算出長度。 –