оптимизация компилятора g ++ - PullRequest
1 голос
/ 17 января 2012
list<mpz_class> baseFactor;

1)

int *tab = new int [baseFactor.size()]; //baseFactor.size() ~= 20000
for(i = 0; i < baseFactor.size(); i++){
  cout << tab[i] << endl;
}

// Total time: 2.620790

2)

int size = baseFactor.size();
int *tab = new int [size]; //baseFactor.size() ~= 20000
for(i = 0; i < size; i++){
  cout << tab[i] << endl;
}

//Total time: 0.366500

Почему компилятор g ++ не оптимизирует код 1) в 2)?

Ответы [ 3 ]

5 голосов
/ 17 января 2012

В зависимости от того, где определено baseFactor (глобальная переменная?), Компилятору может быть трудно доказать, что size() всегда возвращает одно и то же значение.

Если это невозможно доказать, вызовне может быть выведен из цикла.

2 голосов
/ 17 января 2012

Для того, чтобы первый был оптимизирован для второго, потребовалось бы, чтобы baseFactor.size () никогда не менялся во время цикла.

Конечно, это, вероятно, не меняется, но знает ли об этом компилятор?

1 голос
/ 17 января 2012

A std::list контейнер представляет собой связанный список, и вычисление его размера может быть дорогостоящим (алгоритм O (n), который изменился в последнем стандарте C ++ 11 IIRC). Компилятор не знает, что тело вашей функции не изменяется basefactor, поэтому его размер вычисляется один раз в каждом цикле в первом случае (при каждом тесте цикла for) и только один раз во втором.

Возможно, вам следует рассмотреть возможность использования std::vector.

...