从ifstream读到stringstream的有效方法
Efficient Way to Read from ifstream to stringstream
我有这个函数:
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中设置一个错误,如果你遇到一行比你的缓冲区长。插入字符数组比插入字符串要快。然而,如果这段代码真的花了那么多时间,我会感到惊讶。
相关文章:
- 在C++中初始化向量映射的最有效方法
- 将此布尔值传递给此函数的最有效方法是什么?
- 比较C++变量的最有效方法
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 存储变量的更有效方法是什么?
- 确保套装新鲜度的有效方法
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 映射唯一值和重复值的有效方法.可以访问键或值的位置
- 在C++事务之间存储大量字符数据的有效方法
- 在unordered_multimap中精确迭代一次每个键的有效方法
- 一种将 Dart 中的字节数据转换为 C++ 中的无符号字符*的有效方法?
- 检查两个向量是否并行的最有效方法
- 从浮点数中删除小数部分但保留类型的有效方法
- 传递非泛型函数的最有效方法是什么?
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 创建字符串数组的有效方法
- 返回一个引用C++中另一个类对象的对象的有效方法
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 从std::map值中获取密钥的有效方法