std::memmove
Определён в заголовочном файле <cstring> | ||
|---|---|---|
void* memmove( void* dest, const void* src, std::size_t count ); |
Выполняет следующие операции по порядку:
- Копирует
countсимволов (как если бы они имели тип unsignedchar, далее аналогично) из объекта, на который указываетsrc, во временный массивarrизcountсимволов, гдеarrне перекрывает объекты, на которые указываютdestиsrc. -
Неявно создаёт объекты по адресу
dest. - Копирует
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 | было неясно, указывает ли возвращаемый указатель на подходящий созданный объект | уточнено |
См. также
| копирует один буфер в другой (функция) |
|
|
(C++26) | заполняет буфер символом (функция) |
| копирует заданное количество широких символов между двумя, возможно перекрывающимися, массивами (функция) |
|
|
(C++11) | копирует диапазон элементов в новое место (шаблон функции и функциональный объект алгоритма) |
|
(C++20)(C++20) | |
| копирует диапазон элементов в обратном порядке (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
|
(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