Объявление локальной переменной внутри "виртуального" цикла оптимизации - PullRequest
2 голосов
/ 08 мая 2011

На этот раз я не смог найти то, что искал (не знаю, не ищу ли я нужные вещи ...), но вот оно:

В 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 ]

3 голосов
/ 08 мая 2011

Использование профилировщика

В существующем виде функция объявлена ​​встроенной в классе.Этот код будет тривиально оптимизирован, и компилятор в любом случае, вероятно, получит распределения из цикла (в зависимости от того, какое количество ошибок вы оставили за кадром).

Также перегруженные операторы массива, вероятно,векторизация в gcc (начиная с -O3 -ftree-vectorize).Просто посмотрите на подробный вывод с

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

, чтобы увидеть, какие циклы были векторизованы, и если нет, то почему бы и нет.Во что бы то ни стало взгляните на вывод g ++ -S и т. Д.

Используйте профилировщик .Не «оптимизируйте», если вы не знаете, что это необходимо.

0 голосов
/ 08 мая 2011

Почему бы не подумать о том, чтобы сделать массивы приватными членами?Если вы хотите гарантировать отсутствие накладных расходов при распределении стека во время выполнения, делая их закрытыми членами, то для других программистов будет ясно, что именно это происходит, когда переключение компилятора или оптимизация, автоматически выполняемая компилятором, не всегда очевидны для другихдэвы.

0 голосов
/ 08 мая 2011

Передайте их в качестве параметров функции Bar.Массивы распадаются на указатели и будут проходить довольно быстро.

0 голосов
/ 08 мая 2011

Вы можете объявить массивы как статические.Это заставит компилятор резервировать для них некоторую память, а не помещать их в стек каждый раз, когда вы вызываете функцию.Имейте в виду, что это нарушает безопасность потоков.

Также помните, что стек предварительно выделен;этот код на самом деле не выделяет новую память для ваших массивов, он просто размещает их в памяти, которая уже выделена.Здесь нет накладных расходов.Ваш компилятор может зарезервировать место для всех трех массивов только с одной инструкцией.

...