Я понимаю, что getline записывает свой результат в tmp, а затем копирует tmp в вектор, копируя его.
Это правильно. Поскольку tmp
является lvalue, должна быть сделана копия.
Но будет ли эффективнее вместо этого делать vec.push_back(std::move(tmp))
, чтобы избежать копирования?
Да-иш. Если вы используете move
, вместо копирования всей строки у вас просто пара обменов указателей / целых чисел. Это означает, что это может быть намного быстрее. Безопасно использовать getline
для заполнения перемещенной строки на каждой итерации, поэтому здесь нет проблем ( source ).
Единственный способ, которым это не быстрее, - это еслиСтрока имеет короткую строковую оптимизацию, и если данные, которые вы помещаете в строку, достаточно коротки, чтобы соответствовать ей. Затем вы имеете дело с фактически массивом символов, и вы должны сделать копию, так как массивы не могут быть перемещены.