在C语言中,指针的增量和索引的增量有什么区别?

6

考虑以下两段代码:

void PrintLetter(char *src)
{
 while(*src != '\0')
 {
   printf("%c",*src);
   src++;
 }
}

并且

void PrintLetter(char *src)
{
 int i;
 for(i=0;src[i];i++)
  printf("%c",src[i]);
}

两者之间有性能差异吗?

4
为什么会有踩票?我不明白这是一个“糟糕”的问题。也许提问者不了解优化器,但这并不是踩票的理由,对吗? - user142019
3
没错。我给出了一个完全合理的答案,但是却被3个人踩了。第一个代码快中所做的指针算术比依赖编译器优化略快。就是这样。然而我却收到了3个踩?是人们今天早上恶意或者无知吗? - Chris Eberle
4
更大的问题是,谁能百分之百地确信编译器总是能做正确的事情? - Chris Eberle
2
@Bo:是的,我有很多情况下指针算术运算明显更快。我经常处理图像I/O,进行偏移计算会使程序变得非常缓慢,即使进行了优化(这主要是因为有两个维度,编译器无法智能地优化2步偏移计算)。所以,我会写成*img; img++而不是img[i+j*width]。编译器并不总是最聪明的。程序员需要比他/她的工具更加聪明。 - Chris Eberle
2
哦,我不是在提倡总是进行优化。我知道优化的第一条规则(不要这样做)。我只是说有时候你必须意识到它只是一个愚蠢的工具,而且你需要了解它的局限性。当涉及到像图像I / O这样的东西时,即使我很想避免优化(即使它变得无法读取),这几乎是获得合理性能的唯一途径。编译器虽然通常是正确的,但并非总是如此。 - Chris Eberle
显示剩余9条评论
2个回答

5

没有任何区别。编译器会执行优化,无论你的编写形式如何。底层汇编代码是相同的。


+1 已确认,LLVM 对于两者提供了完全相同的汇编代码(diff 没有返回结果) :) - user142019
此外,一个非常好的优化器会将其优化为 printf("%s", src); - user142019

2

任何性能差异都取决于编译器。

一些小型嵌入式系统具有相当简单的编译器,可能会为其中一个生成略有不同的代码 - 但是没有经过测试,很难猜测哪一个最终会更好(尽管如果我必须盲目猜测,我可能会选择第一个)。

对于典型桌面/服务器系统上的编译器(例如gcc,VC ++,EDG),无论选择哪个,您都会得到(基本上)相同的结果,因此选择它们纯粹是选择您觉得更易读的内容的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接