评论
# re: memcpy这个不定时炸弹
2012-09-11 00:21
ilvu
当memcpy有重叠时就要用memmove 回复 更多评论
# re: memcpy这个不定时炸弹[未登录]
2012-09-11 09:04
korall
应该是重叠引致的吧。
复制时数据重叠本来就应该要注意。
相对来说,memcpy 不考虑重叠的情况,复制效率好;memmove会考虑到源于目标的重叠,效率会低一点但是能正确工作。
但支持重叠也有限,如果目标头部和源尾部重叠,那么两者都无能为力。
其实这是程序员的事情 回复 更多评论
# re: memcpy这个不定时炸弹[未登录]
2012-09-11 09:08
korall
哦,倒是忘了,memmove 还有一种倒序拷贝,能支持目标头部与源尾部重叠的情况。 回复 更多评论
# re: memcpy这个不定时炸弹
2012-09-11 09:14
注册好麻烦
既然是粘包,怎么会有重叠问题呢。难道一块内存还有多种用途?
这种情况一般都是在数据量大的时候,出现的小几率事件造成的,应该检查读取逻辑 回复 更多评论
# re: memcpy这个不定时炸弹
2012-09-11 09:23
zuhd
@注册好麻烦
也有拆包的情况
回复 更多评论
# re: memcpy这个不定时炸弹
2012-09-14 15:51
hydra
明显的地址重叠问题,msdn上对memcpy的这种情景已经说的很清楚了:
If the source and destination overlap, the behavior of memcpy is undefined. Use memmove to handle overlapping regions. 回复 更多评论
# re: memcpy这个不定时炸弹
2012-09-15 06:55
neutralevil
关于memcpy的实现,还真就不是你抄出来的代码那样的,现代编译器都支持所谓Intrinsics技术,像memcpy这样的函数根本不会照源码老老实实生成函数代码和函数调用代码,而是在调用处直接插入优化后的汇编代码。要探究memcpy的真正行为,最好通过调试器查看汇编代码。 回复 更多评论
# re: memcpy这个不定时炸弹[未登录]
2014-09-23 08:24
FongLuo
char m_pSrc[1024*10];
当nLen=6, nOffset=24,调用
memcpy(m_pSrc, &m_pSrc[nLen], nOffset);
明显重叠了:
源范围:&m_pSrc[6] <==> &m_pSrc[6+24]
目的范围:&m_pSrc[0] <==> &m_pSrc[24] 回复 更多评论