【发布时间】:2011-11-17 17:49:17
【问题描述】:
我想逐行读取文件并捕获特定的输入行。为了获得最佳性能,我可以通过读取整个文件并使用指针迭代其内容来以低级方式执行此操作,但是此代码对性能不是很重要,因此我希望使用更具可读性和类型安全的标准库样式实现。
所以我拥有的是这样的:
std::string line;
line.reserve(1024);
std::ifstream file(filePath);
while(file)
{
std::getline(file, line);
if(line.substr(0, 8) == "Whatever")
{
// Do something ...
}
}
虽然这不是性能关键代码,但我在解析操作之前调用了 line.reserve(1024),以防止在读入较大的行时对字符串进行多次重新分配。
在 std::getline 中,字符串在将每一行的字符添加到它之前被擦除。我单步执行了这段代码,让自己确信内存没有在每次迭代中重新分配,我发现这让我大吃一惊。
深入到 string::erase 而不是仅仅将它的大小变量重置为零它实际上正在做的是调用 memmove_s 指针值,它将覆盖缓冲区的已使用部分,紧随其后的是缓冲区的未使用部分,除了调用 memmove_s 时的计数参数为零,即请求移动零字节。
问题:
为什么我希望在我可爱的循环中间产生一个库函数调用的开销,尤其是一个被调用而根本不做任何事情的循环?
我自己还没有把它拆开,但是在什么情况下这个调用实际上不会什么都不做,而是实际上会开始移动缓冲区块?
为什么要这样做?
额外问题:C++ 标准库标签是什么?
【问题讨论】:
-
STL(有些错误,但被接受)、std 或 stdlib。
-
啊,我试过 C++-std-library 并没有解决。所以习惯了命名空间我忘了它只是一个缩写:)
标签: c++ visual-studio-2008 c++-standard-library