我想逐行读取文件并捕获一个特定的输入行。为了获得最佳性能,我可以通过读取整个文件并使用指针迭代其内容以低级别的方式执行此操作,但是此代码对性能不是至关重要的,因此我希望使用更具可读性和类型安全的标准库样式实现。
所以我所拥有的是:
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++ 标准库标签是什么?