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 にフォールバックします。
例
Run this code
#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';
}
出力: