Форум программистов, компьютерный форум CyberForum.ru

Оптимизирует ли компилятор код при использовании функции, возвращающей константу? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
05.09.2013, 14:51     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #1
Объясните мне компиляторы С++ оптимизируют такой код?. Да и вообще компиляторы оптимизуруют это?
Я просто думал, что сохраняется адрес памяти, а оттуда цикл вытаскивает то, что там по адресу лежит,

т.е. я мыслил так: "в примере на адрес кладется адрес функции, значит в конце каждой итерации эта функция будет выполняться. "

C++
1
2
3
4
5
6
7
8
9
10
11
int myfunc()
{
    return 99;
}
 
int main()
{
  for (i=0;i!=myfunc();i++)  std::cout<<i<<"  ";
    
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2013, 14:51     Оптимизирует ли компилятор код при использовании функции, возвращающей константу?
Посмотрите здесь:

C++ identifier not found при использовании функции system()
C++ Есть объект типа T, но если вместо него подставить вызов функции, возвращающей T, код не компилится, почему?
Выход из функции, возвращающей значение C++
Почему компилятор не воспринимает define константу C++
C++ Ошибка при использовании функции-члена
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
05.09.2013, 14:53     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #2
Этот цикл вообще возможно в линейку развернуть
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
05.09.2013, 14:58     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #3
Цитата Сообщение от daslex Посмотреть сообщение
Объясните мне компиляторы С++ оптимизируют такой код?
глупый вопрос, все зависит от компилятора, кто то может и оптимизирует но надеяться на это не стоит.

i из цикла for не объявлена, данная программа работать не будет.

Все что объявлено в цикле, будет уничтожено после завершения цикла. Все что было объявлено до цикла, может быть модифицировано (изменено) в цикле и после завершения цикла (выхода из цикла) данные изменения останутся в силе.

Добавлено через 3 минуты
Цитата Сообщение от daslex Посмотреть сообщение
myfunc()
функция будет вызываться по новой каждый раз, ни чего не будет запоминаться. Представь что у тебя функция будет возвращать текущее время или случайное число, о каком запоминание может идти речь.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
05.09.2013, 15:02  [ТС]     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #4
Цитата Сообщение от Croessmah Посмотреть сообщение
Этот цикл вообще возможно в линейку развернуть
я знаю. но интерес в таком вот виде, где вызывается функция.
просто куда-то неявно результат проверки на истинность сохраняется, а сохраняется это в значение или же сохраняется сам результат работы функции в какую-то неявно созданную переменную. мне непонятно.
меня запутали, поэтому такой глупый вопрос.

Цитата Сообщение от VLK Посмотреть сообщение
i из цикла for не объявлена
опечатался

Добавлено через 1 минуту
VLK, о таком

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
 
using namespace std;
 
int myfunc()
{
    return 99;
}
 
int main()
{
  for (int i=0;i!=myfunc();i++)
  {
      std::cout<<i<<" ";
      i+=2;
  }
 
    return 0;
}
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
05.09.2013, 15:06     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #5
Что то я не до конца понимаю вопрос, т.е. у тебя есть функцию и все что она делает это возвращает 99, и тебе интересно, при выполнении цикла, что бы компилятор за место i!=myfunc() поставил i!=99 ?
Я точно не знаю, и опять же как было сказано зависит от компилятора, но я на 99% уверен, что он не будет подставлять за место функции число, это глупо и черевато ошибками, которые будет очень сложно найти.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
05.09.2013, 15:31  [ТС]     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #6
VLK, этот ваш ответ не ответ. Глупо-не глупо. В любом случае в памяти запоминается значение и независимо от того, что я делаю внутри цикла с этим значением, цикл будет выполнен столько раз, сколько он считал итераций при первом к нему обращении.

а сохраняется значение как переменная или как ссылка на функцию мне непонятно.
из вашего ответа ценно только то, что это зависит от компилятора. Остальное лишние слова.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
05.09.2013, 15:31     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #7
Цитата Сообщение от daslex Посмотреть сообщение
#include <iostream>
using namespace std;
int myfunc()
{
return 99;
}
int main()
{
for (int i=0;i!=myfunc();i++)
{
std::cout<<i<<" ";
i+=2;
}
return 0;
}
в дебаггере в дисассемблерном виде глянуть да и все, есть ли вызовы call или нет в счетчике
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
05.09.2013, 15:40     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #8
Цитата Сообщение от daslex Посмотреть сообщение
VLK, этот ваш ответ не ответ. Глупо-не глупо. В любом случае в памяти запоминается значение и независимо от того, что я делаю внутри цикла с этим значением, цикл будет выполнен столько раз, сколько он считал итераций при первом к нему обращении.
На самом деле в этом и кроется основная суть ответа - ЯП создаются явно не для функций типа int myfunc() { return 99; } и разработчики ЯП и компиляторов наверное ни когда не задумывались что кому то в голову придет мысль сделать подобную функцию, по этому функция каждый круг цикла вызывается по новой и возвращает новое значение, а не ссылку или что то там еще, т.к. функция по логике может \ должна возвращать разные (динамические) значения.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
05.09.2013, 15:42  [ТС]     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #9

Не по теме:

Вопрос если что не мой (на ветке 1С был, просто интересно и для C++ узнать)


Не по теме:

Raali, если бы я умел читать то, что показывает дизасемблрный вид, если бы...



Добавлено через 2 минуты

Не по теме:

VLK, программисты, разработавшие популярные ЯП заглянули настолько вперед, что нам с вами не снилось даже. И хватит от темы отходить. То что я использовал простую конструкцию - это чтобы ее читать было максимально легко.

Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
05.09.2013, 15:45     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #10
Цитата Сообщение от daslex Посмотреть сообщение
Raali, если бы я умел читать то, что показывает дизасемблрный вид, если бы...
можете прислать сюда, если, конечно ваш Ide поддерживает генерацию asm, в студии точно можно, только удалите все лишние вещи из кода
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
05.09.2013, 16:24     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #11
У меня gcc подставляет 99, начиная с -O2.

Добавлено через 4 минуты
И это без лишних советов, а можно ведь ещё constexpr добавить или __attribute__ ((pure)).
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
05.09.2013, 21:11  [ТС]     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #12

Не по теме:

У меняcodeblocks-12.11mingw GCC compiler
можно без просмотра дизасемблерного кода смотреть легко. Сразу не сообразил.



C++
1
2
3
4
5
6
7
8
9
10
11
12
int myfunc()
{
     std::cout<<"iii\n";
    return 99;
}
 
int main()
{
  for (int i=0;i!=myfunc();i++)   i+=2;
 
    return 0;
}
Показывает, что на каждой итерации цикла выполняется функция, а не берется сохраненное значение.

Не по теме:

Но, наверное, какие-то компиляторы С++ оптимизируют этот код, так чтобы в промежуточное значение сохранялся результат работы функции и проверка идет на условие с этим промежуточным значением. Хотя, может и никакие компиляторы С++ так не делают.

Всем спасибо



Добавлено через 50 секунд
Somebody, честно говоря, вас понял плохо.
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
05.09.2013, 21:20     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #13
Цитата Сообщение от daslex Посмотреть сообщение
Показывает, что на каждой итерации цикла выполняется функция, а не берется сохраненное значение.
Так в этом и суть, что если добавляешь туда вывод строки, то приходится выполнять эту функцию на каждой итерации ради вывода этой строки. Если вывод уберёшь, то константа подставляется прямо в цикл, а функция вообще не вызывается. Но в таком случае надо смотреть скомпилированный код.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
05.09.2013, 21:29  [ТС]     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #14
Хорошо. Я сделал так
C++
1
2
3
4
5
6
7
8
9
10
11
12
using namespace std;
int myfunc()
{
    return 99;  //сюда точку останова
}
 
int main()
{
  for (int i=0;i!=myfunc();i++)   i+=2;
 
    return 0;
}
Пошаговое выполнение (F8). Функция вызывается каждый раз.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,064
05.09.2013, 21:33     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #15
Цитата Сообщение от Somebody Посмотреть сообщение
Если вывод уберёшь, то константа подставляется прямо в цикл, а функция вообще не вызывается.
а ты в этом уверен?
все зависит от компилятора, а точнее от настроек оптимизатора
нормальный оптимизатор даже вот это выкинет
Цитата Сообщение от daslex Посмотреть сообщение
for (int i=0;i!=myfunc();i++) * i+=2;
в цикле ничего не происходит и значит зачем он нужен?
но!!! если myfunc() лежит в другом С файле(другая единица трансляции) ничего не сократит
поскольку оптимизатор не знает что возвращает myfunc, и цикл честно прокрутится 33 раза
разве что заменит на это
C++
1
for (int i=0;i!=myfunc();i+=3);
Добавлено через 1 минуту
Цитата Сообщение от daslex Посмотреть сообщение
Пошаговое выполнение (F8). Функция вызывается каждый раз.
правильно Дебиг режим, оптимизатор не вступил в работу
только дизасемблирование поможет разгадать задачку
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
05.09.2013, 21:38     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #16
Так это потому что без оптимизации. Code::Blocks? Правой кнопкой на проекте -> Build options -> Compiler Flags -> Optimize even more (for speed) [-O2]. Тогда в этом примере даже цикла не будет, потому что его результат нигде не используется.

Добавлено через 3 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
а ты в этом уверен?
все зависит от компилятора, а точнее от настроек оптимизатора
Да, я проверял первый пример, где в цикле вывод.
Цитата Сообщение от ValeryS Посмотреть сообщение
правильно Дебиг режим, оптимизатор не вступил в работу
Ну, можно с отладочной инфой и оптимизацией одновременно. Тогда и так видно.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
05.09.2013, 21:45  [ТС]     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #17
Цитата Сообщение от Somebody Посмотреть сообщение
Compiler Flags
найти там не могу

Добавлено через 1 минуту
нашел

Добавлено через 2 минуты
Цитата Сообщение от Somebody Посмотреть сообщение
Optimize even more (for speed) [-O2]
а как это по-русски звучит. Хотя приблизительно. (чтобы знал, как говорить, если вдруг придется)
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,064
05.09.2013, 21:48     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #18
Цитата Сообщение от Somebody Посмотреть сообщение
Да, я проверял первый пример, где в цикле вывод.
раз есть вывод значит цикл не выбросится, а функцию может выкинуть, а может и нет
утверждать это нельзя, компиляторов куча и у каждого свои заморочки

теперь попробуй определить функцию в другом файле, 90% что функция будет вызываться
выбросить её может со сквозной оптимизацией, а их не так много
но если написать так
C++
1
2
3
4
inline int myfunc()
{
return 99;
}
то все вопросы отпадут
не будет вызываться функция, поскольку и функции не будет

Добавлено через 2 минуты
Цитата Сообщение от daslex Посмотреть сообщение
а как это по-русски звучит. Хотя приблизительно.
"Оптимизация по скорости" оптимизирует код для более быстрого выполнения,размер может увеличится, может например цикл развернуть
есть еще "Оптимизация по размеру"
есть и другие
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
05.09.2013, 22:00  [ТС]     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #19
Ясно. спасибо. Может подскажете еще как в CodeBlocks дизасемблировать проект. А-то я даже просто посмотреть его не могу в таком дизасемблированном виде.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2013, 22:20     Оптимизирует ли компилятор код при использовании функции, возвращающей константу?
Еще ссылки по теме:

Компилятор выдает ошибку при использовании фабричного метода C++
C++ CodeBlocks ругается при использовании функции copy()
Ошибки при использовании встроенной функции C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,064
05.09.2013, 22:20     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #20
Цитата Сообщение от daslex Посмотреть сообщение
Может подскажете еще как в CodeBlocks дизасемблировать проект.
не могу сказать
Но есть сторонние дизасемблеры, например IDA, любой код дизасемблируют
есть отладчики, например самый популярный сейчас OllyDbg (олька)
но учти что работают они с бинарным кодом, ты увидишь ассемблерные инструкции
Yandex
Объявления
05.09.2013, 22:20     Оптимизирует ли компилятор код при использовании функции, возвращающей константу?
Ответ Создать тему
Опции темы

Текущее время: 08:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru