名稱空間
變體
操作

std::memmove

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

按順序執行以下操作

  1. 隱式地在 dest 建立物件。
  2. count 個字元(如同 unsigned char 型別,下同)從 src 所指向的物件複製到一個臨時陣列 arr 中,該陣列有 count 個字元,其中 arr 不與 destsrc 所指向的物件重疊。
  3. count 個字元從 arr 複製到 dest 所指向的物件中。

destsrc空指標非法指標,則行為未定義。

目錄

[編輯] 引數

dest - 指向要複製到的記憶體位置的指標
src - 指向要複製來源的記憶體位置的指標
count - 要複製的位元組數

[編輯] 返回值

若存在合適的已建立物件,則返回指向它的指標;否則返回 dest

[編輯] 注意

儘管規範聲稱使用臨時緩衝區,但此函式的實際實現不會帶來雙重複制或額外記憶體的開銷。對於較小的 count,它可能會載入並寫入暫存器;對於較大的塊,常見方法(glibc 和 bsd libc)是,如果目標在源之前開始,則從緩衝區開頭向前複製位元組,否則從末尾向後複製,在完全沒有重疊時回退到 std::memcpy

嚴格別名禁止將同一記憶體作為兩種不同型別的值進行檢查時,`std::memmove` 可用於轉換值。

[編輯] 示例

#include <cstring>
#include <iostream>
 
int main()
{
    char str[] = "1234567890";
    std::cout << str << '\n';
    std::memmove(str + 4, str + 3, 3); // copies from [4, 5, 6] to [5, 6, 7]
    std::cout << str << '\n';
}

輸出

1234567890
1234456890

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

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

[編輯] 參閱

將一個緩衝區複製到另一個緩衝區
(函式) [編輯]
用字元填充緩衝區
(函式) [編輯]
在兩個可能重疊的陣列之間複製一定數量的寬字元
(函式) [編輯]
將一個範圍的元素複製到一個新位置
(函式模板) [編輯]
以逆序複製一個範圍的元素
(函式模板) [編輯]
檢查型別是否為可平凡複製型別
(類模板) [編輯]
C 文件 for memmove