"virtual"循环优化中的局部变量声明

Local-variable declaration inside a "virtual" loop optimization

本文关键字:局部变量 声明 优化 virtual 循环      更新时间:2023-10-16

这一次,我找不到我要找的东西(如果我没有搜索正确的东西,那就不知道......)但是,这里是:

在 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是临时数组,作为数据成员并不重要,只是用来填充类成员......显然,调用该函数的开销是不必要的......有没有办法(好吧,我试图避免将它们作为类成员)告诉编译器"节省分配空间"或其他东西,以便减少开销?康斯特会给编译器任何提示吗?我不确定我是否清楚...

无论如何,谢谢!

使用探查器

就目前而言,该函数在类中以内联方式声明。这段代码将进行微不足道的优化,编译器无论如何都可能会将分配排除在循环之外(实际上取决于您遗漏了多少琐碎的东西)。

此外,重载的数组运算符可能会在 gcc 中被矢量化(从 -ftree-vectorize 的 -O3 开始)。看看放的冗长

g++ -O3 -march-native -ftreevectorizer-verbose=2 ...

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

使用探查器。如果您不知道有必要,请不要"优化"。

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

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

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

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