std::memcpy(3)
π std::memcpy π
okay bestie, this one is from the C++ Standard Libary manual (yes, that's the manual name β spelling and all, we're keeping it π ), and it's literally the βcopy bytesβ icon. let's get into it β¨
π NAME π
std::memcpy β std::memcpy
that's it. that's the name. she's self-titled, main character energy π.
β¨ Synopsis β¨
Defined in header <cstring> β write that down, bestie π«Ά
void* memcpy( void* dest, const void* src, std::size_t count );
so here's the tea: it copies count bytes from the object pointed to by src to the object pointed to by dest. both objects are reinterpreted as arrays of unsigned char. that's the whole job π
if the objects overlap, the behavior is undefined. not βkinda weirdβ, not βmaybe fineβ β undefined, periodt π
if eitherdestorsrcis an invalid or null pointer, the behavior is undefined, even ifcountis zero. yeah, even zero. do not test her π
if the objects are potentially-overlapping or not TriviallyCopyable, the behavior of memcpy is not specified and may be undefined. this is not a vibe, this is a warning π
π¦ Parameters π¦
destβ pointer to the memory location to copy tosrcβ pointer to the memory location to copy fromcountβ number of bytes to copy
π Return value π
dest.
that's it. the same pointer you handed in, boo. she gives it right back π«Ά
πΈ Notes πΈ
std::memcpymay be used to implicitly create objects in the destination buffer. iconic behavior, honestly β¨std::memcpyis meant to be the fastest library routine for memory-to-memory copy. it is usually more efficient thanstd::strcpy, which must scan the data it copies orstd::memmove, which must take precautions to handle overlapping inputs. the way that speed is the whole point π₯- several C++ compilers transform suitable memory-copying loops to
std::memcpycalls. compiler said βI got youβ fr fr π - where strict aliasing prohibits examining the same memory as values of two different types,
std::memcpymay be used to convert the values. loophole? no bestie, it's literally the sanctioned move π§
π Example π
// Run this code
#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();
}
π Output: π
dest[4] = {'o', 'n', 'c', 'e'};
0x1.999999999999ap-4 is 3fb999999999999a as a std::int64_t
{42}
π See also π
memmoveβ moves one buffer to another (function)memsetβ fills a buffer with a character (function)wmemcpyβ copies a certain amount of wide characters between two non-overlapping arrays (function)copyβ copies characters (public member function ofstd::basic_string<CharT,Traits,Allocator>)copyβ copies a range of elements to a new location (function template)copy_ifβ(function template)(C++11)(the See also section is a little squished in the original, so this is literally what's there, bestie π)copy_backwardβ copies a range of elements in backwards order (function template)is_trivially_copyable(C++11) β checks if a type is trivially copyable (class template)- C documentation for
memcpy
okay that's the whole page, bestie. this masterpiece came from http://cppreference.com, dated 2024.06.10, and it's the std::memcpy(3) manual page. go copy some bytes responsibly, mwah ππβ¨
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms