用指针替换循环索引器有什么好处吗?

Rot*_*tem 1 c++ optimization micro-optimization visual-c++

假设:

const int n = bigNumber;
float* f = someData;
Run Code Online (Sandbox Code Playgroud)

转换是否有任何意义

for (int i = 0; i < n; i++)
{
    f[i] += 1;
}
Run Code Online (Sandbox Code Playgroud)

float* lastF = f + n;
for (float* i = f; i < lastF; i++)
{
    *i += 1;
}
Run Code Online (Sandbox Code Playgroud)

天真地看着这个,似乎我为每次迭代(the f[i])保存了一个加法运算.

当然,这假设我对循环内的索引器的值没有兴趣.

  1. 我是否正确的心态?
  2. 如果是这样,我的编译器是否足够聪明,可以单独执行此操作(假设启用了所有优化标志)?

我会检查拆卸,但我读这些很糟糕.

n. *_* m. 5

没有任何好处.如今,任何编译器都可以比大多数程序员更好更快地完成任务.

如果f[i++]代码中的可读性比*fp++,请不要三思而后行.它们将被编译为完全相同的目标代码.

  • 我实际上已经看到了使用当代编译器(例如`gcc`)的情况,它们似乎用`f [i ++]`形式比`*fp ++`生成更好的代码.我从来没有挖出它来弄清楚为什么(也许有一些神秘的原因决定了每种情况下可以进行的优化),但我发现自己偏爱索引方法. (3认同)