2014-07-04 56 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中设置错误。插入字符数组插入字符串会更快。不过,如果这段代码真的花了很多时间,我会感到很惊讶。