std::memcpy
Определено в заголовочном файле <cstring> | ||
|---|---|---|
void* memcpy( void* dest, const void* src, std::size_t count ); |
Копирует count байта из объекта, на который указывает src, в объект, на который указывает dest. Оба объекта интерпретируются как массивы unsigned char.
Если объекты перекрываются, поведение не определено.
Если либо dest , либо src является некорректным или нулевым указателем, поведение не определено, даже если count равно нулю.
Если объекты потенциально перекрываются или не являются TriviallyCopyable, поведение memcpy не определено и может быть неопределённым.
Параметры
| dest | - | указатель на место в памяти, куда копировать |
| src | - | указатель на место в памяти, откуда копировать |
| count | - | количество байтов для копирования |
Возвращаемое значение
dest
Примечания
std::memcpy может использоваться для неявного создания объектов в буфере назначения.
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}См. также
| перемещает один буфер в другой (функция) |
|
| заполняет буфер символом (функция) |
|
| копирует определенное количество широких символов между двумя непересекающимися массивами (функция) |
|
| копирует символы (публичный член-функция std::basic_string<CharT,Traits,Allocator>) |
|
|
(C++11) | копирует диапазон элементов в новое место (шаблон функции) |
| копирует диапазон элементов в обратном порядке (шаблон функции) |
|
|
(C++11) | проверяет, является ли тип тривиально копируемым (шаблон класса) |
Документация C для memcpy |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/string/byte/memcpy