Форум — Development Цикл for изнутри c++, gcc, компилятор, оптимизация 0 1 Допустим, я пишу такой код: for(int i = 0; i < ceil(sqrt(arr.size())); ++i) Интересно знать, вычисляется ли ceil(sqrt(arr.size())) на каждой итерации, или компилятор оптимизирует вычисления?Компилятор GCC. Ссылка
Может оптимизировать, если функция инлайнится или помечена атрибутом const. Но лучше на это не полагаться. unsigned ★★★★ (02.11.12 11:52:42 MSK) Показать ответ Ссылка
если код arr.size() не виден из текущей единицы трансляции - будет вычисляться каждый раз, в любом случае так писать нельзя wota ★★ (02.11.12 12:07:24 MSK) Ссылка
Очень плохой вариант. Если размер arr в цикле не меняется - надо его сохранять во временной переменной. trex6 ★★★★★ (02.11.12 13:45:11 MSK) Показать ответ Ссылка
Ответ на: комментарий от trex6 02.11.12 13:45:11 MSK А если меняется, то никто не гарантирует, что он будет вычисляться на каждой итерации. Я в таком разе использую while. Delirium_veritas ★ (02.11.12 13:53:31 MSK) Показать ответ Ссылка
Интересно знать, вычисляется ли ceil(sqrt(arr.size())) на каждой итерации, или компилятор оптимизирует вычисления?gcc -S да посмотри madcore ★★★★★ (02.11.12 13:54:46 MSK) Ссылка
Ответ на: комментарий от unsigned 02.11.12 11:52:42 MSK Может оптимизировать, если функция инлайнится или помеченаатрибутом const.К слову, атрибут const у метода класса вовсе не означает, что данный метод для данного состояния объекта будет возвращать одинаковые значения. yoghurt ★★★★★ (02.11.12 14:18:51 MSK) Показать ответ Ссылка
Ответ на: комментарий от yoghurt 02.11.12 14:18:51 MSK Имелся в виду __attribute__((const)). unsigned ★★★★ (07.11.12 11:16:02 MSK) Ссылка
Ответ на: комментарий от Delirium_veritas 02.11.12 13:53:31 MSK А если меняется, то никто не гарантирует, что он будет вычисляться на каждой итерации. Вроде гарантирует. Legioner ★★★★★ (07.11.12 11:34:16 MSK) Показать ответ Ссылка
Ответ на: комментарий от Legioner 07.11.12 11:34:16 MSK На каком-то из gcc (версии года так 2004-2005) у меня уже был залёт. При -O<2 пересчитывал, а с -O2 и -O3 нет. Помню полдня на отладку убил. Delirium_veritas ★ (08.11.12 06:10:22 MSK) Показать ответ Ссылка
Ответ на: комментарий от Delirium_veritas 08.11.12 06:10:22 MSK Значит баг компилятора. Legioner ★★★★★ (08.11.12 06:30:23 MSK) Показать ответ Ссылка
Ответ на: комментарий от Legioner 08.11.12 06:30:23 MSK Ну баг не баг, а как-то повелось у меня с тех пор в таких случаях while использовать. Хотя в приведённом примере лучше воспользоваться советом trex6. Delirium_veritas ★ (08.11.12 06:36:01 MSK) Ссылка