猿问

memcpy()vs memmove()

我想了解的区别memcpy()和memmove(),和我读的文本memcpy(),而没有照顾重叠源和目的地memmove()一样。


但是,当我在重叠的存储块上执行这两个功能时,它们都给出相同的结果。例如,在memmove()帮助页面上采用以下MSDN示例:-


有没有更好的例子来了解它的缺点memcpy以及如何memmove解决?


// crt_memcpy.c

// Illustrate overlapping copy: memmove always handles it correctly; memcpy may handle

// it correctly.


#include <memory.h>

#include <string.h>

#include <stdio.h>


char str1[7] = "aabbcc";


int main( void )

{

    printf( "The string: %s\n", str1 );

    memcpy( str1 + 2, str1, 4 );

    printf( "New string: %s\n", str1 );


    strcpy_s( str1, sizeof(str1), "aabbcc" );   // reset string


    printf( "The string: %s\n", str1 );

    memmove( str1 + 2, str1, 4 );

    printf( "New string: %s\n", str1 );

}

输出:

The string: aabbcc

New string: aaaabb

The string: aabbcc

New string: aaaabb


慕盖茨4494581
浏览 598回答 3
3回答

MMMHUHU

对于您的示例没有任何奇怪的行为,我并不感到完全惊讶。尝试复制str1到str1+2,然后看看会发生什么。(实际上可能没有什么不同,取决于编译器/库。)通常,memcpy以简单(但快速)的方式实现。简单地说,它只是按顺序循环数据,从一个位置复制到另一个位置。这可能会导致在读取源时将其覆盖。Memmove会做更多的工作来确保正确处理重叠。编辑:(不幸的是,我找不到合适的例子,但是这些都可以)。对比此处显示的memcpy和memmove实现。memcpy只是循环,而memmove执行测试以确定循环方向,以免破坏数据。这些实现非常简单。大多数高性能的实现更为复杂(涉及一次复制字大小的块而不是字节)。

慕的地8271018

中的内存memcpy 不能重叠,否则您可能会面临不确定的行为,而其中的内存memmove可能会重叠。char a[16];char b[16];memcpy(a,b,16);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// validmemmove(a,b,16);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Also valid, but slower than memcpy.memcpy(&a[0], &a[1],10);&nbsp; // Not valid since it overlaps.memmove(&a[0], &a[1],10); // valid.&nbsp;memcpy的某些实现可能仍适用于重叠的输入,但是您不能指望这种行为。虽然记忆必须允许重叠。
随时随地看视频慕课网APP
我要回答