Блок задач

7. Шаблоны C++

Темы
Сложность 3

Задача «Оптимизированный copy»

Реализовать собственную версию шаблонной функции copy с ускорением работы для частных случаев.

Мотивация

Шаблонная функция std::copy реализует простой цикл. При копировании, например, массивов байтов (char или unsigned char) процесс будет происходить побайтово. Однако в силу архитектуры памяти и процессора копирование одного байта требует столько же времени, сколько и копирование машинного слова (4 байта для 32-разрядной архитектуры, 8 байт — для 64-разрядной). Функции побайтового копирования из стандартной библиотеки C (memcpy, memmove, strcpy и т.д.) учитывают этот нюанс, и мы могли бы воспользоваться ими.

Описание задачи

Возьмите два частных случая:

  1. Итераторы являются указателями.
  2. Итераторы относятся к std::vector.

И при условии, что элемент в принципе допускает побайтовое копирование (для проверки можно воспользоваться is_fundamental), реализуйте вызов memmove в соответствующих частных специализациях.

Тестирование

Проверьте, что копирование работает корректно, а также то, что частные специализации достаточно ограничены, чтобы не использовать memmove для более сложных типов данных. Например, для итераторов std::vector<std::string> мы не можем использовать memmove. Здесь должен сработать общий алгоритм копирования.