名前空間
変種

std::memmove

提供: cppreference.com
<tbody> </tbody>
ヘッダ <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';
}

出力: