Говорите об очень распространенных математических функциях, таких как sin, cos и т.д. компилятор понимает, что у них нет побочных эффектов и есть возможность переместить их на внешние петли? Например
// Unoptimized
double YSinX(double x,int y)
{
double total = 0.0;
for (int i = 0; i < y; i++)
total += sin(x);
return total;
}
// Manually optimized
double YSinX(double x,int y)
{
double total = 0.0, sinx = sin(x);
for (int i = 0; i < y; i++)
total += sinx;
return total;
}
Если они могут, существует ли способ объявить функцию как не имеющую побочных эффектов и, следовательно, быть безопасным для оптимизации таким образом? Первоначальное профилирование приложения VS2010 предполагает, что оптимизация полезна.
Смотрите также этот связанный вопрос, который близок, но не совсем отвечает на мои собственные.
Изменить: Некоторые отличные ответы. Тот, который я принял, основывался на комментариях, которые он вызывал как сам ответ, в частности связанная статья, и тот факт, что подъем может не произойти в ситуациях, когда errno
установлен (т.е. Побочный эффект). Таким образом, и в контексте того, что я делаю, этот тип ручной оптимизации по-прежнему имеет смысл.