名稱空間
變體
操作

std::memcpy

來自 cppreference.com
< cpp‎ | string‎ | byte
在標頭檔案 <cstring> 中定義
void* memcpy( void* dest, const void* src, std::size_t count );

按順序執行以下操作

  1. 隱式地在 dest 處建立物件。
  2. 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++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 4064 C++98 不清楚返回的指標是否指向一個合適的已建立物件 已明確

[編輯] 參見

將一個緩衝區移動到另一個緩衝區
(函式) [編輯]
用字元填充緩衝區
(函式) [編輯]
在兩個不重疊的陣列之間複製一定數量的寬字元
(函式) [編輯]
複製字元
(std::basic_string<CharT,Traits,Allocator> 的公共成員函式) [編輯]
將一個範圍的元素複製到一個新位置
(函式模板) [編輯]
以逆序複製一個範圍的元素
(函式模板) [編輯]
檢查型別是否為可平凡複製型別
(類模板) [編輯]
C 文件 for memcpy