std::memcpy
来自 cppreference.cn
定义于头文件 <cstring> |
||
void* memcpy( void* dest, const void* src, std::size_t count ); |
||
按顺序执行以下操作
- 隐式创建在 dest 的对象。
- 从 src 指向的对象复制 count 个字符(如同类型为 unsigned char),到 dest 指向的对象。
如果满足以下任何条件,则行为未定义
目录 |
[编辑] 参数
dest | - | 指向要复制到的内存位置的指针 |
src | - | 指向要从中复制的内存位置的指针 |
count | - | 要复制的字节数 |
[编辑] 返回值
如果存在合适的已创建对象,则返回指向它的指针;否则返回 dest。
[编辑] 注意
std::memcpy
旨在成为最快的内存到内存复制库例程。它通常比 std::strcpy 更有效,后者必须扫描它复制的数据,或者比 std::memmove 更有效,后者必须采取预防措施来处理重叠的输入。
一些 C++ 编译器将合适的内存复制循环转换为 std::memcpy
调用。
在 严格别名 禁止将同一内存作为两种不同类型的值进行检查的情况下,可以使用 std::memcpy
来转换值。
[编辑] 示例
运行此代码
#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(); }
输出
dest[4] = {'o', 'n', 'c', 'e'}; 0x1.999999999999ap-4 is 3fb999999999999a as a std::int64_t {42}
[编辑] 缺陷报告
以下行为变更缺陷报告被追溯应用于以前发布的 C++ 标准。
DR | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
LWG 4064 | C++98 | 不清楚返回的指针是否指向合适的已创建对象 | 明确了 |
[编辑] 参见
将一个缓冲区移动到另一个缓冲区 (函数) | |
用字符填充缓冲区 (函数) | |
在两个非重叠数组之间复制一定数量的宽字符 (函数) | |
复制字符 ( std::basic_string<CharT,Traits,Allocator> 的公共成员函数) | |
(C++11) |
将一系列元素复制到新位置 (函数模板) |
以相反的顺序复制一系列元素 (函数模板) | |
(C++11) |
检查类型是否为可平凡复制的 (类模板) |
C 文档 关于 memcpy
|