Namespaces
Variants

std:: memmove

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

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

  1. dest にオブジェクトを暗黙的に作成 します。
  2. src が指すオブジェクトから count 文字(型 unsigned char として扱う、以下同様)をコピーし、 count 文字の一時配列 arr に格納します。 ここで arr dest src が指すオブジェクトと オーバーラップしません。
  3. arr から count 文字を dest が指すオブジェクトにコピーします。

dest または src ヌルポインタ または 無効なポインタ の場合、動作は未定義です。

目次

パラメータ

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

戻り値

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

注記

仕様では一時バッファが使用されるとされているにもかかわらず、この関数の実際の実装では二重コピーや余分なメモリのオーバーヘッドは発生しません。小さい count の場合、レジスタの読み込みと書き出しが行われる可能性があります。より大きなブロックでは、一般的なアプローチ(glibcおよびbsd libc)として、コピー先がコピー元より前に始まる場合はバッファの先頭から順方向に、それ以外の場合は末尾から逆方向にバイトをコピーし、全くオーバーラップがない場合には std::memcpy にフォールバックします。

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

#include <cstring>
#include <iostream>
int main()
{
    char str[] = "1234567890";
    std::cout << str << '\n';
    std::memmove(str + 4, str + 3, 3); // copies from [4, 5, 6] to [5, 6, 7]
    std::cout << str << '\n';
}

出力:

1234567890
1234456890

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

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

関連項目

バッファを別のバッファにコピーする
(関数)
バッファを文字で埋める
(関数)
2つの配列(重複する可能性あり)間で指定された量のワイド文字をコピーする
(関数)
要素の範囲を新しい場所にコピーする
(関数テンプレート)
要素の範囲を逆順にコピーする
(関数テンプレート)
型がトリビアルコピー可能かどうかをチェックする
(クラステンプレート)