std:: memcpy
From cppreference.net
|
定义于头文件
<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() { // 简单用法 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"; // 重新解释 double d = 0.1; // std::int64_t n = *reinterpret_cast<std::int64_t*>(&d); // 别名违规 std::int64_t n; std::memcpy(&n, &d, sizeof d); // 正确 std::cout << std::hexfloat << d << " is " << std::hex << n << " as a std::int64_t\n" << std::dec; // 在目标缓冲区中创建对象 struct S { int x{42}; void print() const { std::cout << '{' << x << "}\n"; } } s; alignas(S) char buf[sizeof(S)]; S* ps = new (buf) S; // 定位 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++标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| LWG 4064 | C++98 | 未明确返回的指针是否指向适当创建的对象 | 已明确说明 |
参见
|
移动一个缓冲区到另一个
(函数) |
|
|
用字符填充缓冲区
(函数) |
|
|
在两个不重叠数组间复制指定数量的宽字符
(函数) |
|
|
复制字符
(
std::basic_string<CharT,Traits,Allocator>
的公开成员函数)
|
|
|
(C++11)
|
复制元素范围到新位置
(函数模板) |
|
按逆序复制元素范围
(函数模板) |
|
|
(C++11)
|
检查类型是否可平凡复制
(类模板) |
|
C 文档
for
memcpy
|
|