使迭代器成为指针会加速C循环吗?

我运行了以下内容:

#include  typedef unsigned short boolean; #define false 0 #define true (!false) int main() { int STATUS = 0; int i = 0; boolean ret = true; for(i = 0; i < 99999; i++) { ret = ret && printf("Hello, World."); } if(!ret) { STATUS = -1; } return STATUS; } 

它在不到一秒钟内完成。 通常为0.9 – 0.92。

然后我改变了int i = 0; to int *i = 0; 现在我的执行时间不到0.2秒。 为什么速度变化?

您的运行时由打印到控制台所需的时间占主导地位。 int ++上的i ++将指针增加指针的大小。 根据您的计算机和编译器设置,这将是4或8。 根据您报告的数字,可能是4.因此printf只执行了四分之一。

通常情况下,打印到控制台将比任何增益大几个数量级,您可以对这样的循环进行微优化。

你真的确定你的第二个版本打印你好世界99999次吗?

当你正在做for(int *i = 0; i++ ; i < 99999 ) ,如果指针值(一个地址)小于99999,那你就是在唠叨,这通常没有多大意义。 递增指针意味着您将其向上移动以指向下一个元素,并且因为您有一个int *,所以您将通过sizeof(int)字节递增指针。

你只是迭代99999 / sizeof(int)次。

你对nos答案的评论证实了我的怀疑:它是指针算法。 当你使用++增加一个int指针时,它不只是向数字添加一个,而是实际上按整数的大小跳跃,通常是4(字节)。 所以i++实际上是在i的数值上加4。

类似地,如果你在一个指针上使用+= ,比如i += 5 ,那么它不会仅仅为i的数值加5(或者其他),它将以多个整数的大小前进i ,所以5 * 4 =在这种情况下为20个字节。

这背后的原因是,如果你有一大块内存,你将其视为一个数组,

 int array[100]; // for example 

您可以通过递增指针来迭代数组中的元素。

 int* i = array; int* end = array + 100; for (i = array; i < end; i++) { /* do whatever */ } 

如果使用不同大小的数据类型,则不必重写循环。

原因是因为指针的增量操作不同。

在整数中, i++ i递增1。

对于指针, i++按指向对象的大小递增,根据您的体系结构,它将为4或8。

因此,当i是指针时,你的循环只运行迭代计数的1/4或1/8,而当i是int时。

使用指针进行此测试的正确方法是:

 int i; int *i_ptr = &i; for (*i_ptr = 0; *i_ptr < 99999; *i_ptr++) { ...