【发布时间】: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