【问题标题】:How does pointer increment compare with index increment in C指针增量如何与 C 中的索引增量进行比较
【发布时间】:2011-09-06 09:21:51
【问题描述】:

考虑以下两个代码:

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]);
}

两者在性能上有区别吗?

【问题讨论】:

  • 为什么投反对票?我不明白这是一个 bad 问题。也许 OP 不了解优化器,但这不是投反对票的理由,不是吗?
  • 是的,认真的。我给出了一个完全合法的答案,并得到了 3 票反对。在不依赖编译器优化的情况下,在第一个块中完成的指针运算稍微快一些。时期。然而我得到了 3 票否决票?今天早上人们只是恶意还是无知?
  • @Bo:更大的问题是,谁会 100% 确定编译器总是会做正确的事情?
  • @Bo:是的,我有很多例子,指针算术只是更快的周期。我在图像 I/O 上做了很多工作,并且即使进行了优化,进行偏移计算也会使程序非常缓慢(这主要是因为有两个维度并且编译器根本不够智能,无法优化两步偏移计算) .所以我会写*img; img++,而不是img[i+j*width]。编译器并不总是最清楚。程序员需要比他/她的工具更聪明。
  • 哦,我并不是在提倡总是优化。我知道优化的第一条规则(不要这样做)。我只是说在某些情况下你必须意识到它只是一个愚蠢的工具,你需要知道它的局限性。当涉及到图像 I/O 之类的东西时,即使我很想避免优化(即使其无法读取),这几乎是获得合理性能的唯一方法。编译器虽然通常是正确的,但并非总是如此。

标签: c pointers integer increment


【解决方案1】:

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

一些小型嵌入式系统具有非常简单的编译器,它们可能会为一个编译器生成与另一个稍有不同的代码——尽管没有测试,很难猜测哪个最终会“更好”(尽管如果我不得不“盲目地”猜测,我可能会选择第一个)。

使用典型桌面/服务器系统(例如 gcc、VC++、EDG)上的编译器,无论哪种方式,您都可能获得(基本上)相同的结果,因此在它们之间进行选择纯粹是选择您认为更具可读性的内容.

【讨论】:

    【解决方案2】:

    什么都没有。无论您编写何种形式,编译器都会执行其优化。底层汇编代码是一样的。

    【讨论】:

    • +1 检查,LLVM 为两者提供完全相同相同的汇编代码(diff 不返回结果):)
    • 另外,一个非常好的优化器会将其优化为printf("%s", src);
    猜你喜欢
    • 1970-01-01
    • 2013-11-02
    • 2015-08-03
    • 2018-07-28
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    相关资源
    最近更新 更多