“虚拟”循环优化中的局部变量声明

时间:2011-05-07 23:16:37

标签: c++ class compiler-optimization local-variables

这一次,我找不到我正在寻找的东西(不知道如果我没有找到合适的东西......)但是,这里是:

在c ++中,假设你有一个函数Bar(),每个周期调用一次......就像这样:

class Foo {
 public:
   void Bar() {
     double my_array[3]; 
     // fills the array based on some calculations
     double my_array1[3]; 
     // fills the array based on some calculations
     double my_array2[3];
     // fills the array based on some calculations
     _member_of_class = my_array + my_array1 + my_array2; //+ overloaded
   }

 private:
   float _member_of_class[3];
}

int main(int argc, char** argv) {
  Foo foo;
  while(/*program running*/) {
    foo.Bar();
    //LOTS of code here
  }
  return 0;
}

现在,my_arrays是临时数组,对于数据成员来说并不重要,只是用来填充类成员...显然,调用该函数的开销是不必要的...有没有办法(好吧,我' m试图避免将它们作为类成员)告诉编译器“保存分配空间”或其他东西,以便减少开销? const会给编译器任何提示吗?我不确定我是否清楚......

无论如何,谢谢!

4 个答案:

答案 0 :(得分:3)

使用分析器

就目前而言,该函数在类中内联声明。这段代码将非常简单地优化,编译器可能无论如何都会从循环中获取分配(取决于你从图片中遗漏了多少,实际上)。

此外,重载的数组运算符可能在gcc中进行矢量化(从-ft-vector的-O3开始)。只需看看

的详细输出
g++ -O3 -march-native -ftreevectorizer-verbose=2 ...

看看哪些循环被矢量化,如果没有,为什么不呢。 一定要看一下g ++ -S等的输出。

使用分析器。如果您不知道有必要,请不要“优化”。

答案 1 :(得分:0)

您可以将数组声明为静态。这将强制编译器为它们保留一些内存,而不是每次调用函数时将它们放在堆栈中。但请记住,这会破坏线程安全性。

还要记住堆栈是预先分配的;这段代码实际上并没有为你的数组分配任何新的内存,它只是将它们放在已经分配的内存中。这里没有开销。您的编译器只需一条指令就可以为所有三个数组保留空间。

答案 2 :(得分:0)

将它们作为参数传递给Bar函数。数组衰减成指针,并且传递速度很快。

答案 3 :(得分:0)

为什么不考虑将数组作为私有成员?如果你想在运行时保证堆栈分配没有开销,那么私有成员会让其他程序员清楚地知道发生了什么,编译器切换或依赖编译器自动完成的优化对其他人来说并不总是显而易见的。开发者。