2009-12-21 150 views
16

我廣泛使用std::stringstream在我的應用程序中構造字符串和錯誤消息。 stringstreams通常非常短壽命的自動變量。我應該預先分配std :: stringstream嗎?

這樣的使用會導致每個變量的堆重新分配嗎?我應該從臨時轉爲班級成員stringstream變量嗎?

在後一種情況下,如何預留stringstream緩衝區? (我應該用足夠大的字符串初始化它還是有更優雅的方法?)

回答

11

您是否對您的執行進行了分析,並發現它們是減慢速度的原因?

考慮它們的用法。它們主要用於代碼正常流程之外的錯誤消息嗎?

至於預留空間......

有些實現可能保留一個較小的緩衝區任何分配發生了stringstream的面前。 std :: string的許多實現都這樣做。

另一種選擇可能是(未經測試!)

std::string str; 
str.reserve(50); 
std::stringstream sstr(str); 

您可能會發現在這個gamedev thread一些更多的想法。

編輯:

stringstream's rdbuf碴周圍也可能是一個解決方案。這種方法可能很容易出錯,所以請be sure it's absolutely necessary。絕對不是優雅或簡潔。

+0

很好的建議;但是,保留50,然後複製該字符串可能會打敗一個小的非堆緩衝區優化(如果您的實現有一個)。如果你想編寫你自己的streambuf,那麼你可以精確控制所有的緩衝區管理;你可以使用ostream(或者istream或者iostream,但是這個問題表明輸出格式是這裏所關心的),而不是通過rbuf來改變字符串流的緩衝區。 – 2011-01-18 05:50:52

+6

我不認爲stringstream保留超過'str'的​​內容長度(這是0)。根據cplusplus.com:「用str的副本構建一個ostringstream對象作爲內容」。參考sais「字符串內容的副本」。它沒有明確說它保留了相同數量的內存。我找不到任何有關使用此構造函數預留內存的資源。 – NickSoft 2013-11-16 11:08:49

+0

您在上面使用的構造函數不再有效。你可以看到沒有拷貝構造函數被刪除。 http://www.cplusplus.com/reference/sstream/stringstream/stringstream/ – user1122069 2017-09-10 00:47:19

1

我不確定,但我懷疑的stringstream與結果string緊密相關。所以我懷疑你可以使用ss.seekp(reserved-1); ss.put('\0');來預留reserved內的stringss內的字節數量。其實我想看到類似ss.seekp(reserved); ss.trunc();的東西,但沒有trunc()流的方法。