2

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

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

不管怎样,谢谢!

4

4 回答 4

3

使用分析器

就目前而言,该函数在类中内联声明。此代码将进行微不足道的优化,并且编译器可能无论如何都会使分配脱离循环(实际上取决于您从图片中遗漏了多少杂物)。

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

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

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

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

于 2011-05-07T23:31:43.960 回答
0

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

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

于 2011-05-07T23:22:51.903 回答
0

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

于 2011-05-07T23:23:31.717 回答
0

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

于 2011-05-08T00:24:16.197 回答