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)?
В зависимости от того, где определено baseFactor (глобальная переменная?), Компилятору может быть трудно доказать, что size() всегда возвращает одно и то же значение.
baseFactor
size()
Если это невозможно доказать, вызовне может быть выведен из цикла.
Для того, чтобы первый был оптимизирован для второго, потребовалось бы, чтобы baseFactor.size () никогда не менялся во время цикла.
Конечно, это, вероятно, не меняется, но знает ли об этом компилятор?
A std::list контейнер представляет собой связанный список, и вычисление его размера может быть дорогостоящим (алгоритм O (n), который изменился в последнем стандарте C ++ 11 IIRC). Компилятор не знает, что тело вашей функции не изменяется basefactor, поэтому его размер вычисляется один раз в каждом цикле в первом случае (при каждом тесте цикла for) и только один раз во втором.
std::list
basefactor
for
Возможно, вам следует рассмотреть возможность использования std::vector.
std::vector