std::memcpy
Определено в заголовочном файле <cstring> | ||
|---|---|---|
void* memcpy( void* dest, const void* src, std::size_t count ); |
Выполняет в указанном порядке следующие действия:
-
Неявно создаёт объекты в
dest. - Копирует
countсимволов (как если бы они имели тип unsignedchar) из объекта, на который указываетsrc, в объект, на который указываетdest.
Поведение не определено, если выполняется любое из следующих условий:
-
destилиsrc— это нулевой указатель или недопустимый указатель. - Копирование выполняется между перекрывающимися объектами.
Параметры
| dest | - | указатель на область памяти, в которую нужно скопировать данные |
| src | - | указатель на область памяти, из которой нужно скопировать данные |
| count | - | количество байтов для копирования |
Возвращаемое значение
Если существует подходящий созданный объект, возвращает указатель на него; в противном случае возвращает dest.
Примечания
std::memcpy предназначена для того, чтобы быть самой быстрой библиотечной функцией копирования памяти. Обычно она эффективнее, чем std::strcpy, которой необходимо просматривать копируемые данные, или std::memmove, которой необходимо принимать меры для обработки перекрывающихся областей памяти.
Некоторые компиляторы C++ преобразуют подходящие циклы копирования памяти в вызовы std::memcpy.
Если строгая алиасинг-модель запрещает просмотр одной и той же области памяти как значений двух разных типов, для преобразования значений можно использовать std::memcpy.
Пример
#include <cstdint>
#include <cstring>
#include <iostream>
int main()
{
// simple usage
char source[] = "once upon a daydream...", dest[4];
std::memcpy(dest, source, sizeof dest);
std::cout << "dest[4] = {";
for (int n{}; char c : dest)
std::cout << (n++ ? ", " : "") << '\'' << c << "'";
std::cout << "};\n";
// reinterpreting
double d = 0.1;
// std::int64_t n = *reinterpret_cast<std::int64_t*>(&d); // aliasing violation
std::int64_t n;
std::memcpy(&n, &d, sizeof d); // OK
std::cout << std::hexfloat << d << " is " << std::hex << n
<< " as a std::int64_t\n" << std::dec;
// object creation in destination buffer
struct S
{
int x{42};
void print() const { std::cout << '{' << x << "}\n"; }
} s;
alignas(S) char buf[sizeof(S)];
S* ps = new (buf) S; // placement new
std::memcpy(ps, &s, sizeof s);
ps->print();
}
Вывод:
dest[4] = {'o', 'n', 'c', 'e'};
0x1.999999999999ap-4 is 3fb999999999999a as a std::int64_t
{42}
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.
| DR | Применялся к | Опубликованное поведение | Исправленное поведение |
|---|---|---|---|
| LWG 4064 | C++98 | было неясно, указывает ли возвращённый указатель на подходящий созданный объект | уточнено |
См. также
| перемещает один буфер в другой (функция) |
|
|
(C++26) | заполняет буфер символом (функция) |
| копирует заданное количество широких символов между двумя неперекрывающимися массивами (функция) |
|
| копирует символы (открытая функция-член std::basic_string<CharT,Traits,Allocator>) |
|
|
(C++11) | копирует диапазон элементов в новое место (шаблон функции и функциональный объект алгоритма) |
|
(C++20)(C++20) | |
| копирует диапазон элементов в обратном порядке (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
|
(C++11) | проверяет, является ли тип тривиально копируемым (шаблон класса) |
Документация по C для memcpy |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/byte/memcpy