gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:43:47 32 4
gpt4 key购买 nike

我有这个功能:

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

我怎样才能更有效地避免多次复制数据。

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

最佳答案

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

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

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

关于c++ - 从 ifstream 读取到 stringstream 的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24566296/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com