Namespaces
Variants

std:: memcpy

From cppreference.net
Definido en el encabezado <cstring>
void * memcpy ( void * dest, const void * src, std:: size_t count ) ;

Realiza las siguientes operaciones en orden:

  1. Crea implícitamente objetos en dest .
  2. Copia count caracteres (como si fueran de tipo unsigned char ) desde el objeto apuntado por src hacia el objeto apuntado por dest .

Si se satisface cualquiera de las siguientes condiciones, el comportamiento es indefinido:

Contenidos

Parámetros

dest - puntero a la ubicación de memoria donde copiar
src - puntero a la ubicación de memoria desde donde copiar
count - número de bytes a copiar

Valor de retorno

Si hay un objeto creado adecuado , devuelve un puntero al mismo; de lo contrario devuelve dest .

Notas

std::memcpy está diseñado para ser la rutina de biblioteca más rápida para copia de memoria a memoria. Normalmente es más eficiente que std::strcpy , que debe escanear los datos que copia, o std::memmove , que debe tomar precauciones para manejar entradas superpuestas.

Varios compiladores de C++ transforman bucles de copia de memoria adecuados en llamadas a std::memcpy .

Donde strict aliasing prohíbe examinar la misma memoria como valores de dos tipos diferentes, std::memcpy puede utilizarse para convertir los valores.

Ejemplo

#include <cstdint>
#include <cstring>
#include <iostream>
int main()
{
    // uso simple
    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";
    // reinterpretación
    double d = 0.1;
//  std::int64_t n = *reinterpret_cast<std::int64_t*>(&d); // violación de aliasing
    std::int64_t n;
    std::memcpy(&n, &d, sizeof d); // OK
    std::cout << std::hexfloat << d << " es " << std::hex << n
              << " como std::int64_t\n" << std::dec;
    // creación de objeto en el búfer de destino
    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();
}

Salida:

dest[4] = {'o', 'n', 'c', 'e'};
0x1.999999999999ap-4 es 3fb999999999999a como std::int64_t
{42}

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 4064 C++98 no estaba claro si el puntero retornado apunta a un objeto creado adecuadamente aclarado

Véase también

mueve un búfer a otro
(función)
llena un búfer con un carácter
(función)
copia cierta cantidad de caracteres anchos entre dos arreglos que no se superponen
(función)
copia caracteres
(función miembro pública de std::basic_string<CharT,Traits,Allocator> )
copia un rango de elementos a una nueva ubicación
(plantilla de función)
copia un rango de elementos en orden inverso
(plantilla de función)
verifica si un tipo es trivialmente copiable
(plantilla de clase)