2014-07-04 109 views
2

我有這樣的功能:有效途徑從ifstream的讀取到字符串流

void GetLine(std::stringstream &output,std::ifstream &input,char C){ 
    static std::string Line; 
    std::getline(input,Line,C); 
    output.str(Line); 
} 

我怎樣才能使它更有效,因爲更多的時候,我必須不復制數據。

編輯:刪除靜態以簡化代碼,修復語法錯誤。沒有錯誤檢查完成,因爲它不需要在這個函數內完成。

+3

相關:在此函數中使用靜態行緩衝區具有*糟糕的*代碼異味,尤其是因爲沒有** io檢查來知道'getline'甚至*工作*。我不知道要解決什麼問題,但我相當確信*不是這樣做的方式。 – WhozCraig

+0

[設置'streambuf'指針?](http://en.cppreference.com/w/cpp/io/basic_ios/rdbuf) –

+0

你爲什麼想這樣做? – AmokHuginnsson

回答

2

Yout主要的性能問題不是複製,而是內存分配。假設你實際上刪除了靜態,你的stirng對象位於堆棧內存中,但是位於內存中的字符串數據在堆中分配。由於您每次都在構建字符串操作,因此您有一個或多個動態分配,並且每行復制都有一個空閒分配。這些分配非常昂貴。

使字符串變爲靜態將有助於以內存爲代價進行計時。在大多數庫實現中,getline不會更改分配用於保存字符串數據的內存量。所以字符串緩衝區將擴展到從文件中讀取的最大字符串的大小並停留在那裏。但是由於字符串對象是靜態的,所以你無法釋放這個內存。還有其他方法可以構建可以解決此問題的程序。

如果這段代碼真的是你代碼中的滯留(你怎麼知道它是?),並且你的輸入有一個最大行長度,那麼不要使用std :: string並使用istream :: getline讀入字符數組。如果遇到比緩衝區長的行,這會在ifstream中設置錯誤。插入字符數組插入字符串會更快。不過,如果這段代碼真的花了很多時間,我會感到很驚訝。