Spec-Zone.ru › C++

std::memmove

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

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

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

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

Параметры

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

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

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

Примечания

Хотя в спецификации указано, что используется временный буфер, фактические реализации этой функции не несут затрат на двойное копирование или дополнительную память. Для небольших 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); // copies from [4, 5, 6] to [5, 6, 7]
    std::cout << str << '\n';
}

Вывод:

1234567890
1234456890

Отчёты об ошибках

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

DR Применён к Поведение согласно опубликованной версии Исправленное поведение
LWG 4064 C++98 было неясно, указывает ли возвращаемый указатель на подходящий созданный объект уточнено

См. также

memcpy
копирует один буфер в другой
(функция)
memsetmemset_explicit
(C++26)
заполняет буфер символом
(функция)
wmemmove
копирует заданное количество широких символов между двумя, возможно перекрывающимися, массивами
(функция)
copycopy_if
(C++11)
копирует диапазон элементов в новое место
(шаблон функции и функциональный объект алгоритма)
ranges::copyranges::copy_if
(C++20)(C++20)
copy_backward
копирует диапазон элементов в обратном порядке
(шаблон функции и функциональный объект алгоритма)
ranges::copy_backward
(C++20)
is_trivially_copyable
(C++11)
проверяет, является ли тип тривиально копируемым
(шаблон класса)
Документация по C для memmove

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/byte/memmove

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API