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.
ContenidosParámetros
Valor de retornoSi hay un objeto creado adecuado , devuelve un puntero al mismo; de lo contrario devuelve dest . Notas
Varios compiladores de C++ transforman bucles de copia de memoria adecuados en llamadas a
Donde
strict aliasing
prohíbe examinar la misma memoria como valores de dos tipos diferentes,
Ejemplo
Ejecutar este código
#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 defectosLos siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
Véase también
| |||||||||||||||||||||||||||||||||||