C++ 使用for循环迭代固定数组是否比手动遍历要慢?

C++ 使用for循环迭代固定数组是否比手动遍历要慢?,c++,c,arrays,for-loop,C++,C,Arrays,For Loop,考虑以下两段代码: float arr1[4], arr2[4]; //Do something here with arr1 and arr2 for (int i = 0; i < 4; i++) arr1[i] += arr2[i]; 假设我使用的是已知固定大小的较大数组,第一个数组会对第二个数组的性能产生影响吗?假设没有编译器优化,那么for循环不可避免地会“较慢”。尽管这两种方法都是O(n),但由于循环开销,的循环有一个更大的常数 对于小型阵列,循环展开是一种合理的时空

考虑以下两段代码:

float arr1[4], arr2[4];
//Do something here with arr1 and arr2
for (int i = 0; i < 4; i++)
    arr1[i] += arr2[i];

假设我使用的是已知固定大小的较大数组,第一个数组会对第二个数组的性能产生影响吗?

假设没有编译器优化,那么
for
循环不可避免地会“较慢”。尽管这两种方法都是O(n),但由于循环开销,的
循环有一个更大的常数

对于小型阵列,循环展开是一种合理的时空权衡,对于真正小型阵列,循环展开实际上可能是一种空间增益

但是手动操作会在创建手动操作所需的多行代码的初始(不可避免的)剪切和粘贴过程中,以及随后需要对“循环体”进行更改时,引入许多人为错误的机会

通常,出于维护和可读性的考虑,最好使用循环。它们还更清楚地传达了代码的意图

最后,对于大型阵列、小型循环体和特定的目标体系结构,处理器的缓存将发挥作用。在许多情况下,整个循环都可以放入缓存中,这使得它比一长串指令要快得多


让编译器担心优化。

这取决于循环的构造方式。对于短循环,内部没有太多代码,这可以由编译器自动完成。它被称为

慢一点吗?更快?没有人,答案是正确的-总是分析你的代码。手动执行可能会更快,因为循环是作为条件跳转实现的。因此,手动检查可能会更快,因为代码将“按顺序”执行,而不是多次跳转到同一位置

考虑以下代码:

int main()
{
    int sum = 0;
    int values[4] = { 1, 2, 3, 4 };

    for(int n = 0; n < 4; ++n)
        sum += values[n];

    return 0;
}
结果:

哪一个更好?哪一个更快?很难说。没有跳转和条件的代码可能会更快,但展开过于复杂的循环可能会导致代码膨胀


那么,我的答案是什么?了解自己。

您是否添加了编译时优化选项?为什么不检查反汇编并自己了解呢?您可以简单地测量时间。这称为“展开”循环。大多数编译器都可以自动执行(至少在启用优化时是这样)。答案取决于编译器和处理器。C没有指定哪个更快。您的答案使编译看起来像是确定性的。不是。生成的程序集将依赖于很多东西。
int main()
{
    int sum = 0;
    int values[4] = { 1, 2, 3, 4 };

    for(int n = 0; n < 4; ++n)
        sum += values[n];

    return 0;
}
int main()
{
    int sum = 0;
    int values[4] = { 1, 2, 3, 4 };

    sum += values[0];
    sum += values[1];
    sum += values[2];
    sum += values[3];

    return 0;
}