close
Пространства имён
Варианты
Действия

std::memmove

Материал из cppreference.com
 
 
 
Однобайтовые строки с завершающим нулём
Функции
Манипуляции с символами
Преобразование в числовые форматы
(C++11)(C++11)
(C++11)(C++11)
Манипуляции со строками
Проверка строки
Манипуляции с памятью
Разное
 
<tbody> </tbody>
Определено в заголовочном файле <cstring>
void* memmove( void* dest, const void* src, std::size_t count );

Копирует count символов из объекта, на который указывает src, в объект, на который указывает dest. Оба объекта интерпретируются как массивы unsigned char.

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

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

Если объекты являются потенциально перекрывающимися и не являются TriviallyCopyable, поведение memmove не указано и может быть неопределённым.

Параметры

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

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

dest

Примечание

std::memmove может использоваться для неявного создания объектов в целевом буфере.

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

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

Пример

#include <cstring>
#include <iostream>

int main()
{
    char str[] = "1234567890";
    std::cout << str << '\n';
    std::memmove(str + 4, str + 3, 3); // копирует из [4, 5, 6] в [5, 6, 7]
    std::cout << str << '\n';
}

Вывод:

1234567890
1234456890

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

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