Spec-Zone.ru › C++

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}

См. также

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

Spec-Zone.ru

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