从ifstream读到stringstream的有效方法

Efficient Way to Read from ifstream to stringstream

本文关键字:有效 方法 stringstream ifstream 读到      更新时间:2023-10-16

我有这个函数:

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

我怎样才能使它更有效率,而不是复制更多的数据,我必须。

编辑:删除静态以简化代码,修复语法错误。不做错误检查,因为它不需要在这个函数中做。

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

将字符串设置为静态将以牺牲内存为代价来帮助计时。在大多数库实现中,getline不会改变为保存字符串数据而分配的内存量。因此,字符串缓冲区将扩展到从文件中读取的最大字符串的大小,并保持在那里。但是因为字符串对象是静态的,你没有办法释放这些内存。还有其他方法来构建程序来解决这个问题。

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