Namespaces
Variants

std:: memcpy

From cppreference.net
定義済みヘッダー <cstring>
void * memcpy ( void * dest, const void * src, std:: size_t count ) ;

以下の操作を順番に実行します:

  1. 暗黙的にオブジェクトを作成 します( dest に)。
  2. src が指すオブジェクトから dest が指すオブジェクトへ、 count 文字( unsigned char 型として)をコピーします。

以下のいずれかの条件が満たされる場合、動作は未定義です:

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - HTMLタグ、属性、
タグ内のテキストは翻訳していません
- C++固有の用語(Parameters、Return value、Notes、Example、Defect reports、See also)は原文のまま保持しています
- 書式と構造は完全に保持されています

パラメータ

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

戻り値

適切に作成されたオブジェクトが存在する場合、そのオブジェクトへのポインタを返します。それ以外の場合は dest を返します。

注記

std::memcpy はメモリ間コピーにおいて最速のライブラリルーチンとして設計されています。通常、 std::strcpy std::memmove よりも効率的です。 std::strcpy はコピーするデータをスキャンする必要があり、 std::memmove は重複する入力に対処するための予防措置を講じる必要があるためです。

いくつかのC++コンパイラは、適切なメモリコピーループを std::memcpy 呼び出しに変換します。

strict aliasing が同じメモリを2つの異なる型の値として検査することを禁止する場合、 std::memcpy を使用して値を変換することができます。

#include <cstdint>
#include <cstring>
#include <iostream>
int main()
{
    // 単純な使用例
    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";
    // 再解釈
    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 a std::int64_t\n" << std::dec;
    // 宛先バッファでのオブジェクト生成
    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++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 4064 C++98 返されたポインタが適切に作成されたオブジェクトを指すかどうかが不明確であった 明確化された

関連項目

バッファを別のバッファに移動する
(関数)
バッファを文字で埋める
(関数)
2つの重ならない配列間で指定量のワイド文字をコピーする
(関数)
文字をコピーする
( std::basic_string<CharT,Traits,Allocator> の公開メンバ関数)
要素の範囲を新しい場所にコピーする
(関数テンプレート)
要素の範囲を逆順でコピーする
(関数テンプレート)
型がトリビアルコピー可能かどうかをチェックする
(クラステンプレート)