从ifstream到stringstream读取的有效方法

时间:2014-07-04 03:31:09

标签: c++

我有这个功能:

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

如何更有效地将数据复制到我必须的次数。

编辑:删除静态以简化代码,修复语法错误。没有进行错误检查,因为它不需要在此函数内完成。

1 个答案:

答案 0 :(得分:2)

Yout主要的性能问题不是复制,而是内存分配。假设你实际上删除了静态,你的stirng对象位于堆栈内存中,但是位于内存中的字符串数据动态地分配在堆上。由于每次都在构造字符串操作,因此每个行都有一个或多个动态分配和一个空闲的行。这些是非常昂贵的分配。

使字符串静态将有助于计时以牺牲内存为代价。在大多数库实现中,getline不会更改分配用于保存字符串数据的内存量。所以字符串缓冲区将扩展到从文件中读取的最大字符串的大小并保持不变。但由于字符串对象是静态的,因此无法释放此内存。还有其他方法来构建可以解决此问题的程序。

如果这段代码真的是代码中的滞留(你怎么知道它?),并且你的输入有最大行长,那么就不要使用std :: string并使用istream :: getline读入字符数组。如果遇到比缓冲区长的行,这将在ifstream中设置错误。插入字符串数组插入字符串的速度更快。但是,如果这段代码真的花了那么多时间,我会感到惊讶。