一般来说,如以下示例代码所示:
使用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);
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 copyint * 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"
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 copychar str[] = "1234567890"; memmove(str + 4, str + 3, 3); // copies from [4, 5, 6] to [5, 6, 7] // 结果:from "1234567890" to "1234456890"
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的结果究竟是什么,似乎和编译器有关,不是一定的。