我经常看到人们使用指针迭代C风格数组,而我发现使用索引更具可读性。下面的例子说明了我想到的两种方式。它们不会导致相同的拆卸...
我的问题:使用“跑步者”而不是索引是否有利?顺便说一句,“跑步者”技术还有另一个名字吗?
是否取决于基础类型,例如int,char还是struct?
struct somestruct
{
float f;
int i;
};
const unsigned int uiSize = 10000;
somestruct * myarray = new somestruct[uiSize];
const somestruct * const pEnd = myarray + uiSize;
// way 1: runner
somestruct * pRunner = myarray;
while(pRunner < pEnd)
{
pRunner->f += 5;
pRunner->i += 5;
++pRunner;
}
// way 2: index
unsigned int ui = 0;
for (ui = 0; ui < uiSize; ++ui)
{
myarray[ui].f += 6;
myarray[ui].i += 4;
}
答案 0 :(得分:5)
使用整数索引或指针并不重要。但是,您提供的两个示例都不遵循C(或C ++)中的标准做法。这是一个重写:
// way 1: runner
for (somestruct * pRunner = myarray; pRunner != pEnd; ++pRunner)
// way 2: index
for (size_t ui = 0; ui < uiSize; ++ui)
当简单地迭代容器的所有元素时,我们总是使用for
循环,而不是while
循环,因为它更简洁和惯用(意味着每个人都这样做) ,所以每个人都可以快速阅读。
答案 1 :(得分:0)
array[index]
这与*(array + index)
相同(在C中)。因此,除了递增index
之外,还有一些*添加项,以便获取您要取消引用的指针array + index
。直接递增指针时不需要额外添加。
*)我希望任何体面的编译器能够在每次迭代时将其归结为单个添加(并将结果缓存在某个寄存器或堆栈中)。从一个好的编译器,我希望它能识别这种模式并生成与直接使用指针相同的代码。
最后评论:除非你在非常紧密循环中使用它,否则你的编译器 无法生成合适的代码profiler告诉你,这是你的性能瓶颈,更喜欢更容易理解和阅读的解决方案。