Namespaces
Variants

std:: memcpy

From cppreference.net
Определено в заголовочном файле <cstring>
void * memcpy ( void * dest, const void * src, std:: size_t count ) ;

Выполняет следующие операции в указанном порядке:

  1. Неявно создаёт объекты по адресу dest .
  2. Копирует count символов (как если бы типа unsigned char ) из объекта, на который указывает src , в объект, на который указывает dest .

Если выполняется любое из следующих условий, поведение не определено:

Содержание

Параметры

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> )
копирует диапазон элементов в новое местоположение
(шаблон функции)
копирует диапазон элементов в обратном порядке
(шаблон функции)
проверяет, является ли тип тривиально копируемым
(шаблон класса)