名前空間
変種
操作

std::memmove

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

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

オブジェクトはオーバーラップしても構いません。 コピーは、文字が一時的な文字配列にコピーされ、その後その配列から dest にコピーされたかのように、行われます。

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

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

目次

[編集] 引数

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

[編集] 戻り値

dest

[編集] ノート

一時的なバッファを使用する「かのように」と規定されているにもかかわらず、この関数の実際の実装は二回のコピーや余分なメモリのオーバーヘッドを負担しません。 小さな count に対しては、レジスタにロードし、書き出すかもしれません。 大きなブロックに対しては、一般的な手法 (glibc および bsd libc) は、コピー先がコピー元より前に始まるならばバッファの先頭から順方向に、そうでなければ末尾から逆方向にバイトをコピーし、オーバーラップがまったくないときは std::memcpy にフォールバックします。

[編集]

#include <iostream>
#include <cstring>
 
int main()
{
    char str[] = "1234567890";
    std::cout << str << '\n';
    std::memmove(str + 4, str + 3, 3); // [4, 5, 6] から [5, 6, 7] へのコピー。
    std::cout << str << '\n';
}

出力:

1234567890
1234456890

[編集] 関連項目

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