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++标准库标签是什么?