std:: memcpy
|
定義済みヘッダー
<cstring>
|
||
|
void
*
memcpy
(
void
*
dest,
const
void
*
src,
std::
size_t
count
)
;
|
||
以下の操作を順番に実行します:
- 暗黙的にオブジェクトを作成 します( dest に)。
- src が指すオブジェクトから dest が指すオブジェクトへ、 count 文字( unsigned char 型として)をコピーします。
以下のいずれかの条件が満たされる場合、動作は未定義です:
目次 |
、
、
パラメータ
| 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>
の公開メンバ関数)
|
|
|
(C++11)
|
要素の範囲を新しい場所にコピーする
(関数テンプレート) |
|
要素の範囲を逆順でコピーする
(関数テンプレート) |
|
|
(C++11)
|
型がトリビアルコピー可能かどうかをチェックする
(クラステンプレート) |
|
Cドキュメント
for
memcpy
|
|