std::memcpy
From cppreference.com
| ヘッダー <cstring> で定義 |
||
| void* memcpy( void* dest, const void* src, std::size_t count ); |
||
以下の操作を順番に実行します
- dest の位置にオブジェクトを暗黙的に生成します。
- src が指すオブジェクトから、count バイト(unsigned char 型として扱われる)を、dest が指すオブジェクトへコピーします。
次のいずれかの条件が満たされる場合、動作は未定義です。
目次 |
[編集] パラメータ
| dest | - | コピー先のメモリ位置へのポインタ |
| src | - | コピー元のメモリ位置へのポインタ |
| count | - | count |
[編集] 戻り値
適切な生成済みオブジェクトがある場合は、それへのポインタを返します。それ以外の場合は dest を返します。
[編集] 注記
std::memcpy は、メモリからメモリへのコピーにおいて最も高速なライブラリルーチンであることを目的としています。通常、コピーするデータをスキャンする必要がある std::strcpy や、重なり合った入力を処理するための予防措置を講じる必要がある std::memmove よりも効率的です。
多くのC++コンパイラは、適切なメモリコピーループを std::memcpy の呼び出しに変換します。
厳密なエイリアシングが、2つの異なる型の値として同じメモリを検査することを禁止している場合、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++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 4064 | C++98 | 返されるポインタが適切な生成済みオブジェクトを指しているかどうかが不明確でした。 | 明確化された |
[編集] 関連項目
| あるバッファを別のバッファに移動する (関数) | |
| バッファを文字で埋める (関数) | |
| オーバーラップしていない2つの配列間で、指定された数のワイド文字をコピーする (関数) | |
| 文字をコピーする ( std::basic_string<CharT,Traits,Allocator> の public メンバ関数) | |
| (C++11) |
要素の範囲を新しい場所にコピーする (関数テンプレート) |
| 要素の範囲を逆順にコピーする (関数テンプレート) | |
| (C++11) |
型がトリビアルにコピー可能であるかをチェックする (クラステンプレート) |
| C言語ドキュメント(memcpy)
| |