游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2606|回复: 8

请教一个++的问题!

[复制链接]

22

主题

40

帖子

44

积分

注册会员

Rank: 2

积分
44
发表于 2008-2-13 21:44:00 | 显示全部楼层 |阅读模式
如下2个代码:

char a[64];

char b[64];

char *s=a;

char *d=b;

for (i=0; i< 64; i++)        *d = *s;



for (i=0; i< 64; i++)        *d++ = *s++;

这2个是等效的吗?

如果是,哪一个更快一些??


1

主题

57

帖子

59

积分

注册会员

Rank: 2

积分
59
QQ
发表于 2008-2-14 15:08:00 | 显示全部楼层

Re:请教一个++的问题!

不一样.第一种情况可能有点不对劲.

*d = *s;这句有点问题了吧,d和s已经是具体的数组元素了,你还在前面加*,你那个a,b数组不是指针吧?

第二种情况就是数组a里的数据copy到数组b去


不过,如果第一种情况是d=s;的话,则两种是等效的.
第一种情况是循环中每次都在d和s指针上加上i以寻址.
第二种情况是循环中每次进行完mov操作后,d和s都加上1
应该两种的速度没什么区别.

当然,我所学有限,如果两种的算法有区别的话,还请高人指正

22

主题

40

帖子

44

积分

注册会员

Rank: 2

积分
44
 楼主| 发表于 2008-2-14 20:12:00 | 显示全部楼层

Re:请教一个++的问题!

不好意思 的确是d = s;

我是从网络上看到说对于i++这种自增,编译器会有很好的优化

所以我想问问看市不是真的

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2008-2-15 14:50:00 | 显示全部楼层

Re:请教一个++的问题!

我不知道你是想把i++和什么相比有优化,感觉你的测试代码没说明问题

在你的代码中d=s那种情况肯定是要比后者效率高
因为同样都在for循环时进行了i++运算,而后者又进行了两次++

1

主题

57

帖子

59

积分

注册会员

Rank: 2

积分
59
QQ
发表于 2008-2-16 10:07:00 | 显示全部楼层

Re: Re:请教一个++的问题!

cyj1986: Re:请教一个++的问题!

我不知道你是想把i++和什么相比有优化,感觉你的测试代码没说明问题

在你的代码中d=s那种情况肯定是要比后者效率高
因为同样都在for循环时进行了i++运算,而后者又进行了两次++



这不一定吧,因为d和s具体编绎成机器码的时候,也是有两条指令:
mov ecx,di ;假设si存的是s,而di存的是d,eax存的是i
add ecx,eax;
mov ebx,di ;
add edx,eax ;

0

主题

28

帖子

33

积分

注册会员

Rank: 2

积分
33
QQ
发表于 2008-2-16 18:22:00 | 显示全部楼层

Re: Re:请教一个++的问题!

r2power: Re:请教一个++的问题!

不一样.第一种情况可能有点不对劲.

*d = *s;这句有点问题了吧,d和s已经是具体的数组元素了,...

我不同意,我认为LZ原本的代码没有问题。请看
char a[64];
char b[64];
char *s=a;
char *d=b;
a和b本身就是指向数组开始地址的指针,那么s和d就是指向指针的指针了。
*s就是a,*d就是b

最后再来说说提高效率的方法
LZ的两种方法看形式应该是第一种快一点,其实你用memset()效率会更高,毕竟memset()是经过编译器厂商特别优化过的

1

主题

57

帖子

59

积分

注册会员

Rank: 2

积分
59
QQ
发表于 2008-2-17 12:14:00 | 显示全部楼层

Re: Re: Re:请教一个++的问题!

leexuany: Re: Re:请教一个++的问题!


我不同意,我认为LZ原本的代码没有问题。请看
char a[64];
char b[64];
char *s=a;
char *d=b;
a和b...

不是的,char *s = a; //声明指针s并使其指向数组a的首无素了,因此s=a
你对指针的使用还不熟
char j; //声明一个char型变量
char *pt = &j;    //声明一个char型指针pt并使其指向j
char *pt2=pt;     //声明一个char型指针pt2并使其等于pt,即使pt2也指向j
因此楼主的那个代码char*s = a;就是让指针s也指向a[0],而不是
你说的声明的指针的指针
楼主自己都说开始时打错了,如果你不信可以自己去写个代码试试

0

主题

28

帖子

33

积分

注册会员

Rank: 2

积分
33
QQ
发表于 2008-2-17 13:01:00 | 显示全部楼层

Re:请教一个++的问题!

a是数组a的首地址也就是&a[0],那s和a就是一样了,
看来开始想错了啊。原来没想过指针和[ ]组合的用法,嘿嘿。

既然指针表示的是一个地址,那么如果是同一个编译器的话,
指针的长度应该都是一样长的吧

1

主题

57

帖子

59

积分

注册会员

Rank: 2

积分
59
QQ
发表于 2008-2-17 13:36:00 | 显示全部楼层

Re:请教一个++的问题!

刚刚我也说错了,指针的长度是都一样的(同编译器).
我想表达的是,不同型指针(比方char型指针和int指针)指向同一个数组(比方char数组)的话,其操作又大大不一样了.
char型指针作++操作后,就会指向下一个char型元素,
而int型指针作++操作后,就会一下了跳过4个char型元素.

如果楼主原文中的是char *s = &a;的话,当s++后,s还是指向指针a内的第二个字节的数据,而不是下一个数组名.
不过讨论这些就没什么意义了,只是我个人的考究癖而已,呵呵.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 04:33

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表