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

std::memmove

Материал из cppreference.com
< cpp‎ | string‎ | byte
 
 
 
Однобайтовые строки с завершающим нулём
Функции
Манипуляции с символами
Преобразование в числовые форматы
(C++11)(C++11)
(C++11)(C++11)
Манипуляции со строками
Проверка строки
Манипуляции с памятью
memmove

Разное
 
Определено в заголовочном файле <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

[править] Смотрите также

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