C++:memset memcpy memmove的定义与区别

 

一般来说,如以下示例代码所示:

使用memset进行初始化 ,使用memcpy进行拷贝操作,使用memmove进行移动。

 

void* memset( void* dest, int ch, std::size_t count );

dest    -    pointer to the object to fill
ch    -    fill byte
count    -    number of bytes to fill(注意是字节数!)

int * p = new int [m];
memset(p, 0, sizeof(int)*m);

参考资料:https://en.cppreference.com/w/cpp/string/byte/memset 

void* memcpy( void* dest, const void* src, std::size_t count );

dest    -    pointer to the memory location to copy to
src    -    pointer to the memory location to copy from
count    -    number of bytes to copy

int * p = new int [m];
memcpy(p, pp, sizeof(int)*m); 

// pp指向包含n个int类型元素的一维数组
// 结果:p初始化为与pp相同的一维数组

char source[] = "once upon a midnight dreary...", dest[4];
memcpy(dest, source, sizeof dest);

// 结果:dest="once"

参考资料:https://en.cppreference.com/w/cpp/string/byte/memcpy 

void* memmove( void* dest, const void* src, std::size_t count );

dest    -    pointer to the memory location to copy to
src    -    pointer to the memory location to copy from
count    -    number of bytes to copy

char str[] = "1234567890";
memmove(str + 4, str + 3, 3); 

// copies from [4, 5, 6] to [5, 6, 7]
// 结果:from "1234567890" to "1234456890"

参考资料:https://en.cppreference.com/w/cpp/string/byte/memmove 

 

memcpy与memmove的区别在于:

memmove会根据地址判断是否会发生“覆盖”,进而自动选择复制赋值方向,避免要"copy from"的内容在被记录前就被作为"copy to"赋值了(因此memmove会比mencpy慢一丢丢)。因此肯定不会发生覆盖时用memcpy,不确定的时候用memmove。

参考资料:https://stackoverflow.com/questions/1201319/what-is-the-difference-between-memmove-and-memcpy

PS. 至于会发生覆盖的情况使用memcpy的结果究竟是什么,似乎和编译器有关,不是一定的。

你可能感兴趣的:(C++)