我怎样才能最好地遍历C数组?用指针还是索引?

时间:2016-04-29 05:43:50

标签: c performance pointers

我经常看到人们使用指针迭代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;
}

2 个答案:

答案 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告诉你,这是你的性能瓶颈,更喜欢更容易理解和阅读的解决方案。