对于小数组的循环?

时间:2016-02-04 04:34:23

标签: c++ performance

在我的代码中,我必须管理一小组数据。例如,我的一些代码可能如下所示:

bool flag0, flag1, flag2, flag3;
int val0, val1, val2, val3;

flag0 = GetFlag(0);
flag1 = GetFlag(1);
     

//从这里做类似的事情。

大多数时候,我可以轻松切换到小数组实现并使用for循环处理它们:

bool flag[4];
int val[4];

for(int i = 0; i < 4; i++)
     flag[i] = GetFlag(i);
     

...

我知道第二种方法产生的代码比第一种方法更易读,但是为了查询...

第一种方法通常会表现更好吗?由于没有循环开销或数组开销,它是否使用更少的内存或更快的运行?

让我们假设代码为了简单起见不使用多线程,也因为我不认为我的程序使用它。

对两者的整体评估?你觉得怎么样?

提前感谢您的回答。

3 个答案:

答案 0 :(得分:8)

首先micro-optimzation这样的这个是不相关的,直到你证明它们是相关的。

关于您的具体问题,至少我想到了两种可能的编译器优化:

  • Loop unrolling,它基本上将您的循环转换为完全没有循环的版本,并且可以很容易地应用于您的案例
  • Automatic parallelization,它可以在多个处理器上并行化循环,但这里的事情变得更复杂,因为编译器必须能够产生多个假设

总而言之,当您拥有更易读和可维护的代码时,请不要避免使用循环。

答案 1 :(得分:1)

您所描述的内容称为&#39;循环展开&#39;。作为代码优化步骤的一部分,编译器会自动为您完成,无需手动完成。

答案 2 :(得分:1)

对于这样的C代码,我认为你写它的方式并不重要。 当使用-O2或-O3标志进行优化时,GCC编译器会做到这一点。使用-O3标志可以为您提供运行速度最快的代码。所以我会记住人类的可读性。 另一件可以帮助的事情是不使用一个变量来做所有事情;如果你声明更多变量,每个变量在程序的一个部分或函数中具有特定用途,它有时会更快。但我相信最重要的是选择的编译器和优化标志。

https://gcc.gnu.org/onlinedocs/gcc/Option-Index.html

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options