Spec-Zone.ru › C++

std::memcpy

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

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

  1. Неявно создаёт объекты в dest.
  2. Копирует 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 было неясно, указывает ли возвращённый указатель на подходящий созданный объект уточнено

См. также

memmove
перемещает один буфер в другой
(функция)
memsetmemset_explicit
(C++26)
заполняет буфер символом
(функция)
wmemcpy
копирует заданное количество широких символов между двумя неперекрывающимися массивами
(функция)
copy
копирует символы
(открытая функция-член std::basic_string<CharT,Traits,Allocator>)
copycopy_if
(C++11)
копирует диапазон элементов в новое место
(шаблон функции и функциональный объект алгоритма)
ranges::copyranges::copy_if
(C++20)(C++20)
copy_backward
копирует диапазон элементов в обратном порядке
(шаблон функции и функциональный объект алгоритма)
ranges::copy_backward
(C++20)
is_trivially_copyable
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API