memcpy 定义,如下:
Void *memcpy(void *dest, const void *src, unsigned int count);
查询msdn, 发现Remark 如下:
memcpy
以上描述针对dest 和 src 所指的内存地址有重叠的情况,内存地址重叠情况,memcpy 函数处理步骤未定,而memmove 对重叠情况给予处理;
在winXP+visual c++2005 测试 memcpy 函数,程序如下:
#include "stdafx.h"
#include
int _tmain (int argc , _TCHAR * argv [])
{
}
结果输出 “aaaabb”, 由此可见windows 平台的c 运行时MSVCRT 的memcpy 函数对重叠部分做了处理,同memmove 的实现。//notes:
下面我们用c 语言来实现memcpy 函数, 首先我们写出不对内存重叠的处理函数,如下:
void *memcpy_no_handle_overlap (void *dest , void *src , unsigned int count )
{
}
测试程序如下:
int _tmain(int argc, _TCHAR* argv[])
{
}
输出结果”aaaaaa”
下面讨论处理memory overlapping 情况,如下图:
判断overlapping 条件如下:
If ( (dest <= src) ||
{
}
Else
{
}
Overlapping 的处理:
我们可以看到memcpy_no_handle_overlap 函数,是从低地址依次赋值到高地址;在处理overlapping 时,如果我们采用同样的方法( 低地址到高地址) ,高地址的值将会被覆盖,所以我们应该从高地址依次到低地址赋值,如下图:
上面两个地址的图,我没看太懂。 其实就是由低到高,传同一个指针进去,重叠的会被覆盖。不要想当然的认为这是俩,会执行正常的memcpy
函数代码如下:
void *memcpy_handle_overlap(void *dest, void *src, unsigned int count)
{
}
测试代码:
int _tmain(int argc, _TCHAR* argv[])
{
}
输出结果为: “aaaabb “
最后测试代码如下:
int _tmain(int argc, _TCHAR* argv[])
{
}
输出结果为:
memcpy(ignore memory overlapping): aaaaaa
memcpy(handle memory overlapping): aaaabb
memcpy( MSVCRT ): aaaabb
memmove( MSVCRT): aaaabb