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
См. также
| копирует один буфер в другой (функция) |
|
| заполняет буфер символом (функция) |
|
| копирует определённое количество широких символов между двумя, возможно перекрывающимися, массивами (функция) |
|
|
(C++11) | копирует диапазон элементов в новое местоположение (шаблон функции) |
| копирует диапазон элементов в обратном порядке (шаблон функции) |
|
|
(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