名前空間
変種
操作

std::memmove

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

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

オブジェクトはオーバーラップしても構いません。 コピーは、文字が一時的な文字配列にコピーされ、その後その配列から 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]
close