std::memcpy
提供: cppreference.com
ヘッダ <cstring> で定義 | ||
void* memcpy(void* dest, constvoid* src, std::size_t count ); | ||
src
の指すオブジェクトから dest
の指すオブジェクトに count
バイトをコピーします。 どちらのオブジェクトも unsignedchar の配列として再解釈されます。
オブジェクトがオーバーラップしている場合、動作は未定義です。
dest
または src
が無効またはヌルポインタの場合、動作は未定義です (たとえ count
がゼロでも)。
オブジェクトが潜在的にオーバーラップしている、または TriviallyCopyable でない場合、 memcpy
の動作は規定されず、未定義になることがあります。
目次 |
[編集]引数
dest | - | コピー先のメモリ位置を指すポインタ |
src | - | コピー元のメモリ位置を指すポインタ |
count | - | コピーするバイト数 |
[編集]戻り値
dest
。
[編集]ノート
std::memcpy
はメモリからメモリへのコピーのための最も高速なライブラリルーチンであることが意図されています。 通常、コピーするデータをスキャンしなければならない std::strcpy や、オーバーラップする入力を処理するための予防措置を取らなければならない std::memmove よりも、効率的です。
一部の C++ コンパイラは、適したメモリコピーループを std::memcpy
の呼び出しに変換します。
厳格なエイリアシングにより同じメモリを2つの異なる型の値として調べることが禁止される場合に、値を変換するために std::memcpy
を使用することができます。
[編集]例
Run this code
#include <iostream>#include <cstdint>#include <cstring> int main(){// 単純な使用方法。char source[]="once upon a midnight dreary...", dest[4]; std::memcpy(dest, source, sizeof dest);for(char c : dest)std::cout<< c <<'\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);// OK std::cout<<std::hexfloat<< d <<" is "<<std::hex<< n <<" as an std::int64_t\n";}
出力:
o n c e 0x1.999999999999ap-4 is 3fb999999999999a as an std::int64_t
[編集]関連項目
バッファを別のバッファへ移動します (関数) | |
バッファを文字で埋めます (関数) | |
2つのオーバーラップしていない配列間でワイド文字を一定量コピーします (関数) | |
(C++11) | 指定範囲の要素を新しい位置にコピーします (関数テンプレート) |
指定範囲の要素を後ろからコピーします (関数テンプレート) | |
(C++11) | 型がトリビアルにコピー可能かどうか調べます (クラステンプレート) |
memcpy の C言語リファレンス |