Я читал о std::copy
на cppreference, и они говорят, что большинство стандартных библиотек будут использовать std::memmove
, если у вас есть непрерывный диапазон и элементы можно легко скопировать. Очевидно, это намного быстрее, чем копирование элементов одно за другим, поскольку, по словам Стефана Т. Лавейжа (разработчика STL), вы можете просто скопировать всю меморицию «одним взрывом».
Допустим, у меня есть диапазон, который соответствует тем же требованиям, например std::vector<int>
, и я хочу переместить свой диапазон в другой std::vector<int>
с помощью std::ranges::move
. Этот алгоритм перемещает элементы один за другим или выполняет ту же проверку, что и std::copy
, и перемещает все за одну операцию? Есть ли какая-нибудь функция, аналогичная std::memmove
, которая делает это? Если нет, будет ли полезна такая функция?
@Eljay Да, это то, что я сказал. Что ты имеешь в виду?
На практике для тривиально копируемых элементов std::copy()
, вероятно, будет использовать std::memmove()
(переместить все «одним взрывом») - но это зависит (на самом деле это проблема качества реализации, а не закона природы). Тем не менее, было бы несложно написать код (специализироваться std::copy()
на тривиально копируемых типах), поэтому я был бы удивлен, если бы качественная реализация стандартной библиотеки (она больше не называется STL, кстати - вам всего 20 лет или около того) устаревший в номенклатуре) сделал бы что-нибудь другое.
Да, это то, что я сказал. Что ты имеешь в виду? Ааа, ну тогда я не понимаю, почему вы тогда задаете этот вопрос. Все хорошо.
@user4581301 user4581301 Похоже, он был предназначен для этой работы.
@ user4581301 он фактически изменил свое второе имя на Томас, чтобы его инициалы были STL. Источник: cppcast
Это делает его смешнее.
Если тип тривиально копируем, то перемещение и копирование — это одна и та же операция. Различие необходимо проводить только для нетривиально копируемых типов. Учитывая непрерывный диапазон тривиально копируемых типов, алгоритму std::move
разрешено использовать std::memmove
в своей реализации.
Для тривиально копируемых типов
std::copy
вероятно используетstd::memmove
.