Namespaces
Variants

std:: memcpy

From es.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)
rellena un búfer con un carácter
(función)
copia una 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 & objeto de función de algoritmo)
copia un rango de elementos en orden inverso
(plantilla de función & objeto de función de algoritmo)
verifica si un tipo es copiable trivialmente
(plantilla de clase)