一般来说,如以下示例代码所示:
使用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 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"参考资料: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 copychar 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。
PS. 至于会发生覆盖的情况使用memcpy的结果究竟是什么,似乎和编译器有关,不是一定的。
本文介绍了C++中的内存操作函数memset用于初始化,memcpy用于拷贝,memmove用于可能涉及重叠区域的移动。文章通过参数解析和示例说明了三者区别,强调在可能的数据覆盖情况下应使用memmove以确保安全性。
2237

被折叠的 条评论
为什么被折叠?



