std:: memcpy
|
Определено в заголовочном файле
<cstring>
|
||
|
void
*
memcpy
(
void
*
dest,
const
void
*
src,
std::
size_t
count
)
;
|
||
Выполняет следующие операции в указанном порядке:
- Неявно создаёт объекты по адресу dest .
- Копирует count символов (как если бы типа unsigned char ) из объекта, на который указывает src , в объект, на который указывает dest .
Если выполняется любое из следующих условий, поведение не определено:
- dest или src является нулевым указателем или недействительным указателем .
- Копирование происходит между перекрывающимися объектами.
Содержание |
Параметры
| dest | - | указатель на область памяти для копирования |
| src | - | указатель на исходную область памяти |
| count | - | количество байтов для копирования |
Возвращаемое значение
Если существует подходящий созданный объект , возвращает указатель на него; в противном случае возвращает dest .
Примечания
std::memcpy
предназначена быть самой быстрой библиотечной функцией для копирования памяти. Обычно она эффективнее, чем
std::strcpy
, которая должна сканировать копируемые данные, или
std::memmove
, которая должна принимать меры предосторожности для обработки перекрывающихся входных данных.
Некоторые компиляторы C++ преобразуют подходящие циклы копирования памяти в вызовы
std::memcpy
.
В случаях, когда
strict aliasing
запрещает обращение к одной и той же области памяти как к значениям двух разных типов,
std::memcpy
может быть использована для преобразования значений.
Пример
#include <cstdint> #include <cstring> #include <iostream> int main() { // простое использование 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"; // реинтерпретация double d = 0.1; // std::int64_t n = *reinterpret_cast<std::int64_t*>(&d); // нарушение алиасинга 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; // создание объекта в целевом буфере struct S { int x{42}; void print() const { std::cout << '{' << x << "}\n"; } } s; alignas(S) char buf[sizeof(S)]; S* ps = new (buf) S; // размещающий 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 | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 4064 | C++98 | it was unclear whether the returned pointer points to a suitable created object | made clear |
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 4064 | C++98 | было неясно, указывает ли возвращаемый указатель на подходящий созданный объект | прояснено |
Смотрите также
|
перемещает один буфер в другой
(функция) |
|
|
заполняет буфер символом
(функция) |
|
|
копирует определённое количество широких символов между двумя неперекрывающимися массивами
(функция) |
|
|
копирует символы
(публичная функция-член
std::basic_string<CharT,Traits,Allocator>
)
|
|
|
(C++11)
|
копирует диапазон элементов в новое местоположение
(шаблон функции) |
|
копирует диапазон элементов в обратном порядке
(шаблон функции) |
|
|
(C++11)
|
проверяет, является ли тип тривиально копируемым
(шаблон класса) |
|
Документация C
для
memcpy
|
|