memcpy(currupt, currupt, 5);为什么可以通过

yo-yo 2010-05-17 06:33:58
memcpy的前两个参数声明为restrict,为什么还可以传入相同的指针?
...全文
136 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangweiit 2010-05-18
  • 打赏
  • 举报
回复
官方上,只是说,会有不确定的结果
但是,我之前也试过,至少,在MS的编译器下,结果还是确定的,就是通过编译,而且复制正常
在vs中,memcpy与memmove效果一样,就算是有重叠的时候
localxiao 2010-05-18
  • 打赏
  • 举报
回复
这2个关键字只是告诉编译器可以这样做,并没有要求编译器检查这段内存真实情况是否是这样的
localxiao 2010-05-18
  • 打赏
  • 举报
回复
restrict 仅限于指针使用,是一个用于编译器优化的关键字

他告诉编译器,这段内存只能由他一个人访问

所以编译器不用每次都去内存中取值,只要在寄存器中取值就可以了

比如
int *p = malloc(sizeof(int) * 10);
p[0] = 0;
p[0] += 5;

比如当前寄存器%eax存放的是p[0],那么编译器可以放心的做如下的优化
addl 5, %eax

而不需要先取p[0]对应地址中的值,再做加法

可以参考关键字volatile

这个关键字的作用刚好相反,告诉编译器,每次都必须从内存中读取
zrcvic 2010-05-17
  • 打赏
  • 举报
回复
因为restrict关键字本身和inline关键字一样,没有任何实际意义,完全可以将它们当成空白。
附:本题结果未定义。
「已注销」 2010-05-17
  • 打赏
  • 举报
回复
声明多个唯一的也行的,意思就是加个范围,便于代码的优化。
编译以后做的事儿都一样。
wibnmo 2010-05-17
  • 打赏
  • 举报
回复
学习。。
yo-yo 2010-05-17
  • 打赏
  • 举报
回复
C的[C99]
声明应该是这样的:void * memcpy( void * restrict destination, void * restrict source, size_t num );
z569362161 2010-05-17
  • 打赏
  • 举报
回复
void *memcpy(void *dest, void *src, unsigned int count);

:由src所指内存区域复制count个字节到dest所指内存区域。

pengzhixi 2010-05-17
  • 打赏
  • 举报
回复
是可以同一个指针,但是像你这个内存折叠的你会发现你运行后里面很多东西有可能不是原来的了。
bencharluo 2010-05-17
  • 打赏
  • 举报
回复
什么意思?没看懂
c++ references上面的声明:
void * memcpy ( void * destination, const void * source, size_t num );

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧