C++ 从ifstream读取到stringstream的有效方法

C++ 从ifstream读取到stringstream的有效方法,c++,C++,我有这个功能: void GetLine(std::stringstream &output,std::ifstream &input,char C){ static std::string Line; std::getline(input,Line,C); output.str(Line); } 我怎样才能使它更高效,不必复制数据更多次 编辑:删除静态以简化代码,修复语法错误。没有执行错误检查,因为它不需要在此函数内执行。您的主要性能问题不是复制,而是

我有这个功能:

void GetLine(std::stringstream &output,std::ifstream &input,char C){
    static std::string Line;
    std::getline(input,Line,C);
    output.str(Line);
}
我怎样才能使它更高效,不必复制数据更多次


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

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

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


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

相关:在这个函数中使用静态行缓冲区会有一种可怕的代码味道,特别是因为没有io检查来知道
getline
是否工作。我不知道要解决什么问题,但我很有信心这不是解决问题的方法。你为什么要这样做?这是不是对
std::getline
的特殊用法,我甚至不能编译它?假设你想像我读到的那样使用它,得到一行代码需要在函数中吗?您可以对(std::string-Line;std::getline(input,Line,input.extended(C));)输出执行类似于
的操作