Difference between revisions of "cpp/string/byte/memcpy"
(partial revert (keeping s/is/is meant to be) - citation needed) |
m (Text replace - "{{concept" to "{{named req") |
||
Line 11: | Line 11: | ||
If either {{tt|dest}} or {{tt|src}} is a null pointer, the behavior is undefined, even if {{tt|count}} is zero. | If either {{tt|dest}} or {{tt|src}} is a null pointer, the behavior is undefined, even if {{tt|count}} is zero. | ||
− | If the objects are not {{ | + | If the objects are not {{named req|TriviallyCopyable}}, the behavior of {{tt|memcpy}} is not specified and [http://stackoverflow.com/questions/29777492 may be undefined]. |
===Parameters=== | ===Parameters=== |
Revision as of 14:36, 15 June 2018
Defined in header <cstring>
|
||
void* memcpy( void* dest, const void* src, std::size_t count ); |
||
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.
If the objects overlap, the behavior is undefined.
If either dest
or src
is a null pointer, the behavior is undefined, even if count
is zero.
If the objects are not TriviallyCopyable, the behavior of memcpy
is not specified and may be undefined.
Contents |
Parameters
dest | - | pointer to the memory location to copy to |
src | - | pointer to the memory location to copy from |
count | - | number of bytes to copy |
Return value
dest
Notes
std::memcpy
is meant to be the fastest library routine for memory-to-memory copy. It is usually more efficient than std::strcpy, which must scan the data it copies or std::memmove, which must take precautions to handle overlapping inputs.
Several C++ compilers transform suitable memory-copying loops to std::memcpy
calls.
Where strict aliasing prohibits examining the same memory as values of two different types, std::memcpy
may be used to convert the values.
Example
#include <iostream> #include <cstdint> #include <cstring> int main() { // simple usage char source[] = "once upon a midnight dreary...", dest[4]; std::memcpy(dest, source, sizeof dest); for (char c : dest) std::cout << c << '\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 an std::int64_t\n"; }
Output:
o n c e 0x1.999999999999ap-4 is 3fb999999999999a as an std::int64_t
See also
moves one buffer to another (function) | |
fills a buffer with a character (function) | |
copies a certain amount of wide characters between two non-overlapping arrays (function) | |
(C++11) |
copies a range of elements to a new location (function template) |
copies a range of elements in backwards order (function template) | |
(C++11) |
checks if a type is trivially copyable (class template) |
C documentation for memcpy
|