Spec-Zone.ru › C++

std::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); // copies from [4, 5, 6] to [5, 6, 7]
    std::cout << str << '\n';
}

Вывод:

1234567890
1234456890

См. также

memcpy
копирует один буфер в другой
(функция)
memset
заполняет буфер символом
(функция)
wmemmove
копирует определённое количество широких символов между двумя, возможно перекрывающимися, массивами
(функция)
copycopy_if
(C++11)
копирует диапазон элементов в новое местоположение
(шаблон функции)
copy_backward
копирует диапазон элементов в обратном порядке
(шаблон функции)
is_trivially_copyable
(C++11)
проверяет, является ли тип тривиально копируемым
(шаблон класса)
C документация для memmove

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

Spec-Zone.ru

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