std:: memcpy
|
Definido en el encabezado
<cstring>
|
||
|
void
*
memcpy
(
void
*
dest,
const
void
*
src,
std::
size_t
count
)
;
|
||
Realiza las siguientes operaciones en orden:
- Crea implícitamente objetos en dest .
- 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:
- dest o src es un puntero nulo o un puntero inválido .
- La copia se realiza entre objetos que se superponen.
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>
)
|
|
|
(C++11)
|
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) |
|
|
(C++11)
|
verifica si un tipo es trivialmente copiable
(plantilla de clase) |
|
Documentación de C
para
memcpy
|
|