为什么VS2008 std :: string.erase()会移动它的缓冲区?

Neu*_*ino 5 c++ visual-studio-2008 c++-standard-library

我想逐行读取文件并捕获一个特定的输入行.为了获得最大性能,我可以通过读取整个文件并使用指针迭代其内容以低级方式执行此操作,但此代码对性能不重要,因此我希望使用更具可读性和类型安全的标准库样式实现.

所以我拥有的是:

 std::string line;
 line.reserve(1024);
 std::ifstream file(filePath);
 while(file)
 {
    std::getline(file, line);
    if(line.substr(0, 8) == "Whatever")
    {
        // Do something ...
    }
 }
Run Code Online (Sandbox Code Playgroud)

虽然这不是性能关键代码,但我在解析操作之前调用了line.reserve(1024)来排除字符串的多次重新分配,因为读入较大的行.

在std :: getline里面,在添加每行的字符之前删除字符串.我逐步完成了这段代码,以满足自己每次迭代都没有重新分配内存,我发现这些内容让我的大脑充满了热情.

深入string :: erase而不是仅将其size变量重置为零实际上正在调用memmove_s,其指针值会覆盖缓冲区的使用部分,紧跟其后的缓冲区的未使用部分,除了memmove_s正在使用count参数调用零,即请求移动零字节.

问题:

为什么我想在我可爱的循环中调用库函数调用的开销,特别是那个被调用什么都没做的东西?

我自己还没有选择它,但在什么情况下,这个调用实际上什么都不做,但实际上会开始移动大块的缓冲区?

为什么这样做呢?

奖金问题:C++标准库标签是什么?

Ben*_*igt 11

这是我一年前报道的一个已知问题,利用您必须升级到未来版本的编译器的修复程序.

Connect Bug:" std::string::erase当擦除到最后时" 很愚蠢,影响std::string::resize"

该标准没有说明任何std::string函数的复杂性,除了swap.