名前空間
変種
操作

std::memcpy

提供: cppreference.com
< cpp‎ | string‎ | byte
ヘッダ <cstring> で定義
void* memcpy( void* dest, const void* src, std::size_t count );

src の指すオブジェクトから dest の指すオブジェクトに count バイトをコピーします。 どちらのオブジェクトも unsigned char の配列として再解釈されます。

オブジェクトがオーバーラップしている場合、動作は未定義です。

dest または src無��またはヌルポインタの場合、動作は未定義です (たとえ count がゼロでも)。

オブジェクトが潜在的にオーバーラップしている、または TriviallyCopyable でない場合、 memcpy の動作は規定されず、未定義になることがあります

目次

[編集] 引数

dest - コピー先のメモリ位置を指すポインタ
src - コピー元のメモリ位置を指すポインタ
count - コピーするバイト数

[編集] 戻り値

dest

[編集] ノート

std::memcpy はメモリからメモリへのコピーのための最も高速なライブラリルーチンであることが意図されています。 通常、コピーするデータをスキャンしなければならない std::strcpy や、オーバーラップする入力を処理するための予防措置を取らなければならない std::memmove より���、効率的です。

一部の C++ コンパイラは、適したメモリコピーループを std::memcpy の呼び出しに変換します。

厳格なエイリアシングにより同じメモリを2つの異なる型の値として調べることが禁止される場合に、値を変換するために std::memcpy を使用することができます。

[編集]

#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

[編集] 関連項目

バッファを別のバッファへ移動します
(関数) [edit]
バッファを文字で埋めます
(関数) [edit]
2つのオーバーラップしていない配列間でワイド文字を一定量コピーします
(関数) [edit]
指定範囲の要素を新しい位置にコピーします
(関数テンプレート) [edit]
指定範囲の要素を後ろからコピーします
(関数テンプレート) [edit]
型がトリビアルにコピー可能かどうか調べます
(クラステンプレート) [edit]