我廣泛使用std::stringstream
在我的應用程序中構造字符串和錯誤消息。 stringstreams
通常非常短壽命的自動變量。我應該預先分配std :: stringstream嗎?
這樣的使用會導致每個變量的堆重新分配嗎?我應該從臨時轉爲班級成員stringstream
變量嗎?
在後一種情況下,如何預留stringstream
緩衝區? (我應該用足夠大的字符串初始化它還是有更優雅的方法?)
我廣泛使用std::stringstream
在我的應用程序中構造字符串和錯誤消息。 stringstreams
通常非常短壽命的自動變量。我應該預先分配std :: stringstream嗎?
這樣的使用會導致每個變量的堆重新分配嗎?我應該從臨時轉爲班級成員stringstream
變量嗎?
在後一種情況下,如何預留stringstream
緩衝區? (我應該用足夠大的字符串初始化它還是有更優雅的方法?)
您是否對您的執行進行了分析,並發現它們是減慢速度的原因?
考慮它們的用法。它們主要用於代碼正常流程之外的錯誤消息嗎?
至於預留空間......
有些實現可能保留一個較小的緩衝區任何分配發生了stringstream的面前。 std :: string的許多實現都這樣做。
另一種選擇可能是(未經測試!)
std::string str;
str.reserve(50);
std::stringstream sstr(str);
您可能會發現在這個gamedev thread一些更多的想法。
編輯:
與stringstream's rdbuf碴周圍也可能是一個解決方案。這種方法可能很容易出錯,所以請be sure it's absolutely necessary。絕對不是優雅或簡潔。
我不確定,但我懷疑的stringstream
與結果string
緊密相關。所以我懷疑你可以使用ss.seekp(reserved-1); ss.put('\0');
來預留reserved
內的string
的ss
內的字節數量。其實我想看到類似ss.seekp(reserved); ss.trunc();
的東西,但沒有trunc()
流的方法。
很好的建議;但是,保留50,然後複製該字符串可能會打敗一個小的非堆緩衝區優化(如果您的實現有一個)。如果你想編寫你自己的streambuf,那麼你可以精確控制所有的緩衝區管理;你可以使用ostream(或者istream或者iostream,但是這個問題表明輸出格式是這裏所關心的),而不是通過rbuf來改變字符串流的緩衝區。 – 2011-01-18 05:50:52
我不認爲stringstream保留超過'str'的內容長度(這是0)。根據cplusplus.com:「用str的副本構建一個ostringstream對象作爲內容」。參考sais「字符串內容的副本」。它沒有明確說它保留了相同數量的內存。我找不到任何有關使用此構造函數預留內存的資源。 – NickSoft 2013-11-16 11:08:49
您在上面使用的構造函數不再有效。你可以看到沒有拷貝構造函數被刪除。 http://www.cplusplus.com/reference/sstream/stringstream/stringstream/ – user1122069 2017-09-10 00:47:19