复制的时候,用memcpy,比for循环节约时间吗?

xinyao06 2010-09-14 07:48:21
是不是为了提高运行速度大家都用库函数?

struct data
{
int m;
flot n;
}

struct data data1;
function(struct data &data2)
{
memcpy(data1,data2,sizeof(data));
}

提示错误:怎么修改

...全文
724 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2010-09-14
  • 打赏
  • 举报
回复
memcpy(&data1,&data2,sizeof(data));
没钱吃饭 2010-09-14
  • 打赏
  • 举报
回复
库函数最大的好处就是安全
程序员要时刻关注内存的
mujiok2003 2010-09-14
  • 打赏
  • 举报
回复
1. 当库函数不能满足需求(功能需求,性能需求等)时自己实现
2.错误:
2.1 函数应指定返回类型, 不需要返回时用void
2.2 memcpy的原型为 void (void*, void*,unsigned int), 所以应该改为 memcpy(&data1, &data2, sizeof(data2));
  • 打赏
  • 举报
回复
memcpy参数必须为地址
zhxingway 2010-09-14
  • 打赏
  • 举报
回复
有道理,学习了.
如果有库函数,或者其实类的方法,我会选择用它们
zotin 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 goodboy1881 的回复:]

http://topic.csdn.net/u/20080324/12/7059a90f-905a-4984-abb3-a9e43e440d16.html

有人讨论过了,这东西的实现其实就是用 for 循环,没比自己写的for快到哪里去。

但是用库函数可以更加的安全,通用性更好,代码更加简洁。
[/Quote]

库函数也有不同的版本,有的版本是用嵌入汇编实现的,那就比for快很多。
dingshaofengbinbin 2010-09-14
  • 打赏
  • 举报
回复
memcpy(&data1,&data2,sizeof(data));
库函数肯定比一般人写的都好啦,如果你自己认为,你比那些人还牛的话,你可以自己写一个效率更高的出来试试。。。。
sallan 2010-09-14
  • 打赏
  • 举报
回复
库函数最大的好处就是安全
程序员要时刻关注内存的
积木 2010-09-14
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080324/12/7059a90f-905a-4984-abb3-a9e43e440d16.html

有人讨论过了,这东西的实现其实就是用 for 循环,没比自己写的for快到哪里去。

但是用库函数可以更加的安全,通用性更好,代码更加简洁。
gamemagic 2010-09-14
  • 打赏
  • 举报
回复
memmove确实比自己写的更快
lazy_2010 2010-09-14
  • 打赏
  • 举报
回复
memcpy(&data1,&data2,sizeof(data));
clariones 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zotin 的回复:]

引用 3 楼 goodboy1881 的回复:

http://topic.csdn.net/u/20080324/12/7059a90f-905a-4984-abb3-a9e43e440d16.html

有人讨论过了,这东西的实现其实就是用 for 循环,没比自己写的for快到哪里去。

但是用库函数可以更加的安全,通用性更好,代码更加简洁。


库函数也有不同的版本,有的……
[/Quote]
还有按长度优化的,一次拷贝一个整数等等。for循环也看for循环些啥。
mymtom 2010-09-14
  • 打赏
  • 举报
回复
至于执行速度方面,建议交给编译器去处理。

以楼主的function为例,实际上只要不多的汇编语句即可完成(编译器为g++)
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl 4(%eax), %edx
movl (%eax), %eax
movl %eax, _data
movl %edx, _data+4
leave
ret
比调用memcpy快多了。
mymtom 2010-09-14
  • 打赏
  • 举报
回复
这种情况下不建议用memcpy,直接复制即可。
在C++中,直接赋值还有一个好处,就是将来如果有需要,可以重载。


#include <ctime>
#include <cstring>

#include <iostream>
using namespace std;

struct DATA {
int n;
float f;
};

struct DATA data;
void func(struct DATA &rd)
{
data = rd;
}

mLee79 2010-09-14
  • 打赏
  • 举报
回复
基本上对所有的编译器, memcpy , strlen 啥的基本函数都是 built-in 函数, 编译器会动用些很无聊的手段去优化它 ...

PEcc6C2XBN 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mujiok2003 的回复:]

1. 当库函数不能满足需求(功能需求,性能需求等)时自己实现
2.错误:
2.1 函数应指定返回类型, 不需要返回时用void
2.2 memcpy的原型为 void (void*, void*,unsigned int), 所以应该改为 memcpy(&data1, &data2, sizeof(data2));
[/Quote]

第2个参数有const修饰吧??

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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