打印

指针的这两个种运算方法哪个快些

[复制链接]
3273|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ilikerome|  楼主 | 2012-4-21 07:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如下:

我自己觉的B要比A快,因为,B比A多了个i++,但是它是加法运算,而A中的

a+100有是乘法运算。

不知这样理解是否正确?

请高手指教。

谢谢!


A
int *p;
int a[100];
for(p=a;p<a+100;p++)
      {.....}   


B

int *p,i;
int a[100];
for(i=0;i<100;i++)
      {
        p++;
        .....}

相关帖子

沙发
john_lee| | 2012-4-21 08:07 | 只看该作者
楼主,你认为 a + 100 中,不管是加法,乘法或是别的运算,编译器会生成实际的代码吗?当然,太烂的编译器就不要考虑了。

使用特权

评论回复
板凳
ayb_ice| | 2012-4-21 08:42 | 只看该作者
这个难说,取决于CPU架构,编译器了

使用特权

评论回复
地板
lllaaa| | 2012-4-21 09:05 | 只看该作者
如果指针类型和int类型宽度一样。两者应该没有显著差异。

如果指针类型宽度比int大,那应该是b快

使用特权

评论回复
5
airwill| | 2012-4-21 09:08 | 只看该作者
楼主的代码是不对等的, B 里面是不该出现 p++;
去掉 p++; 这行对比.
楼上非常正确.

在51系统里, 上面的效率高.
在 ARM 的系统里, 下面的代码不低于上面的代码, 适当的优化, 可能会高于上面的代码.

使用特权

评论回复
6
ilikerome|  楼主 | 2012-4-21 10:02 | 只看该作者
2# john_lee
估计你没明白我的意思。

使用特权

评论回复
7
ilikerome|  楼主 | 2012-4-21 10:03 | 只看该作者
3# ayb_ice

恩,但是大部分cpu或者mcu中的逻辑运算单元应该都是加法吧

使用特权

评论回复
8
ilikerome|  楼主 | 2012-4-21 10:05 | 只看该作者
本帖最后由 ilikerome 于 2012-4-21 10:06 编辑

5# airwill

肯定要P++啊,最终的目的就是要使P++,只是第一个用P本身的值来判断什么时候结束,第二个是用i++来判断什么时候结束。

主要是我觉得a+100这种元算,实际上是 a+100*2(或者4),这里有个乘法运算。

使用特权

评论回复
9
john_lee| | 2012-4-21 12:40 | 只看该作者
8# ilikerome
如果我这样写:
for(p=a;p<&a[100];p++)

或者更明确一些,只是有点不好看:
for(p=a;p<(int*)((int)a + sizeof(a));p++)

你还会认为编译器会有生成有乘法的代码?

使用特权

评论回复
10
john_lee| | 2012-4-21 12:52 | 只看该作者
在进一步,如果你的int p[100]是全局对象,那么,你这个p + 100,应该是常量,对吧?
使用优化良好的编译器,当CPU的指令集中具有可以直接比较立即数地址的情况下(例如x86),一定会生成:
CMP Rx, #addr
之类的指令,addr 就是 p + 100的地址。
如果CPU没有这样的指令(例如 ARM),那么编译器也会把p + 100直接装入某个寄存器,并且这个装入过程,是被提到了循环之前,循环中比较时,就直接比较这个寄存器值就行了。

使用特权

评论回复
11
batsong| | 2012-4-21 15:36 | 只看该作者
李老师威武啊

使用特权

评论回复
12
mxh0506| | 2012-4-21 20:46 | 只看该作者
首先要分清"a + 100"是编译时计算还是运行时计算。如果是编译时计算,那么一次循环中:A包括一次指针比较(p<a+100)运算和一次指针增量运算(p++);而B包括一次循环变量比较(i<100),一次循环变量增量(i++)和一次指针增量(p++)。对于相同的硬件平台和编译器,这时要比较的明显只是 i 和 p 的数据类型。

使用特权

评论回复
13
airwill| | 2012-4-21 22:11 | 只看该作者
5# airwill

肯定要P++啊,最终的目的就是要使P++,只是第一个用P本身的值来判断什么时候结束,第二个是用i++来判断什么时候结束。

主要是我觉得a+100这种元算,实际上是 a+100*2(或者4),这里有个乘法运算。 ...
ilikerome 发表于 2012-4-21 10:05


对于 B,
*p 已经不需要了, 因为 用 a 来存取数据了

使用特权

评论回复
14
O狂且O| | 2012-4-21 23:26 | 只看该作者
<深入理解计算机系统> 讨论了这个问题,  循环展开! 额........

使用特权

评论回复
15
O狂且O| | 2012-4-21 23:30 | 只看该作者
指针运算往往隐含有乘法运算(寻址方式???)! 好的编译器可以优化! GCC 可以, keil或者其他的编译器不知道! 你可以反汇编比较看看!

使用特权

评论回复
16
星火燎原| | 2012-4-22 00:47 | 只看该作者
mark

使用特权

评论回复
17
highgear| | 2012-4-22 10:31 | 只看该作者
理论上,这种情况,一个好的编译器是不会出现乘法运算。但不排除某些编译器的优化令人不可思议。例如 keil c, 很多情况下,指针索引等运算会使用乘法运算。所以楼主问题必须指定编译器,才能有确切的答案。

使用特权

评论回复
18
Tinnal| | 2012-4-22 10:38 | 只看该作者
8# ilikerome 和2、4、8、16等数的乘除法可以直接用移位运算代替。

使用特权

评论回复
19
apple| | 2012-4-22 11:20 | 只看该作者
这好比是说BenZ跑得快还是BMW跑得快

使用特权

评论回复
20
ilikerome|  楼主 | 2012-4-22 22:02 | 只看该作者
9# john_lee
for(p=a;p<(int*)((int)a + sizeof(a));p++)
这段代码还是蛮有意思的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:创造价值是我们学习知识的目的. 知识是创造价值的手段而非全部.

18

主题

516

帖子

0

粉丝