Почему VS2008 std :: string.erase () перемещает свой буфер?

Я хочу читать файл построчно и захватывать одну конкретную строку ввода. Для максимальной производительности я мог бы сделать это на низком уровне, прочитав весь файл и просто перебирая его содержимое с помощью указателей, но этот код не критичен к производительности, поэтому я хочу использовать более читаемую и безопасную реализацию стиля библиотеки std.

Итак, у меня есть следующее:

 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 вызывается с аргументом count, равным нулю, т. е. запрашивает перемещение нулевых байтов.

Вопросы:

Зачем мне нужны накладные расходы на вызов библиотечной функции в середине моего прекрасного цикла, особенно того, который вызывается вообще без каких-либо действий?

Я сам еще не разбирал его, но при каких обстоятельствах этот вызов на самом деле не будет ничего делать, а начнет перемещать куски буфера?

И почему он вообще это делает?

Бонус вопрос: Что такое тег стандартной библиотеки C ++?

5
задан Ben Voigt 17 November 2011 в 18:15
поделиться