Namespaces
Variants

std:: memmove

From cppreference.net
Определено в заголовочном файле <cstring>
void * memmove ( void * dest, const void * src, std:: size_t count ) ;

Выполняет следующие операции в указанном порядке:

  1. Неявно создаёт объекты по адресу dest .
  2. Копирует count символов (как если бы типа unsigned char , далее аналогично) из объекта, на который указывает src , во временный массив arr из count символов, где arr не перекрывается с объектами, на которые указывают dest и src .
  3. Копирует count символов из arr в объект, на который указывает dest .

Если dest или src является нулевым указателем или недействительным указателем , поведение не определено.

Содержание

Параметры

dest - указатель на область памяти для копирования
src - указатель на исходную область памяти
count - количество байтов для копирования

Возвращаемое значение

Если существует подходящий созданный объект , возвращает указатель на него; в противном случае возвращает dest .

Примечания

Несмотря на то, что спецификация указывает на использование временного буфера, фактические реализации этой функции не несут затрат на двойное копирование или дополнительную память. Для малых count может использоваться загрузка и запись регистров; для больших блоков распространённый подход (glibc и bsd libc) — копирование байтов в прямом направлении от начала буфера, если приёмник начинается до источника, и в обратном направлении от конца в противном случае, с переходом на std::memcpy при полном отсутствии перекрытия.

В случаях, когда strict aliasing запрещает обращение к одной и той же области памяти как к значениям двух разных типов, std::memmove может быть использован для преобразования значений.

Пример

#include <cstring>
#include <iostream>
int main()
{
    char str[] = "1234567890";
    std::cout << str << '\n';
    std::memmove(str + 4, str + 3, 3); // copies from [4, 5, 6] to [5, 6, 7]
    std::cout << str << '\n';
}

Вывод:

1234567890
1234456890

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 4064 C++98 было неясно, указывает ли возвращаемый указатель на подходящий созданный объект прояснено

Смотрите также

копирует один буфер в другой
(функция)
заполняет буфер символом
(функция)
копирует определённое количество широких символов между двумя, возможно перекрывающимися, массивами
(функция)
копирует диапазон элементов в новое место
(шаблон функции)
копирует диапазон элементов в обратном порядке
(шаблон функции)
проверяет, является ли тип тривиально копируемым
(шаблон класса)