std::memcpy
來自 cppreference.com
在標頭檔案 <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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 4064 | C++98 | 不清楚返回的指標是否指向一個合適的已建立物件 | 已明確 |
[編輯] 參見
將一個緩衝區移動到另一個緩衝區 (函式) | |
用字元填充緩衝區 (函式) | |
在兩個不重疊的陣列之間複製一定數量的寬字元 (函式) | |
複製字元 ( std::basic_string<CharT,Traits,Allocator> 的公共成員函式) | |
(C++11) |
將一個範圍的元素複製到一個新位置 (函式模板) |
以逆序複製一個範圍的元素 (函式模板) | |
(C++11) |
檢查型別是否為可平凡複製型別 (類模板) |
C 文件 for memcpy
|