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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,665
#1

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

05.09.2013, 14:51. Просмотров 1135. Ответов 33
Метки нет (Все метки)

Объясните мне компиляторы С++ оптимизируют такой код?. Да и вообще компиляторы оптимизуруют это?
Я просто думал, что сохраняется адрес памяти, а оттуда цикл вытаскивает то, что там по адресу лежит,

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

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++ Оптимизирует ли компилятор деление/умножение double?
C++ Есть объект типа T, но если вместо него подставить вызов функции, возвращающей T, код не компилится, почему?
Компилятор выдает ошибку при использовании фабричного метода C++
Почему компилятор не воспринимает define константу C++
Выход из функции, возвращающей значение C++
Ошибки при использовании встроенной функции C++
C++ Ошибка при использовании функции-члена
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
05.09.2013, 14:53     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #2
Этот цикл вообще возможно в линейку развернуть
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
05.09.2013, 14:58     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #3
Цитата Сообщение от daslex Посмотреть сообщение
Объясните мне компиляторы С++ оптимизируют такой код?
глупый вопрос, все зависит от компилятора, кто то может и оптимизирует но надеяться на это не стоит.

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

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

Добавлено через 3 минуты
Цитата Сообщение от daslex Посмотреть сообщение
myfunc()
функция будет вызываться по новой каждый раз, ни чего не будет запоминаться. Представь что у тебя функция будет возвращать текущее время или случайное число, о каком запоминание может идти речь.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,665
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
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
05.09.2013, 15:06     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #5
Что то я не до конца понимаю вопрос, т.е. у тебя есть функцию и все что она делает это возвращает 99, и тебе интересно, при выполнении цикла, что бы компилятор за место i!=myfunc() поставил i!=99 ?
Я точно не знаю, и опять же как было сказано зависит от компилятора, но я на 99% уверен, что он не будет подставлять за место функции число, это глупо и черевато ошибками, которые будет очень сложно найти.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,665
05.09.2013, 15:31  [ТС]     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #6
VLK, этот ваш ответ не ответ. Глупо-не глупо. В любом случае в памяти запоминается значение и независимо от того, что я делаю внутри цикла с этим значением, цикл будет выполнен столько раз, сколько он считал итераций при первом к нему обращении.

а сохраняется значение как переменная или как ссылка на функцию мне непонятно.
из вашего ответа ценно только то, что это зависит от компилятора. Остальное лишние слова.
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,056
Завершенные тесты: 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
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
05.09.2013, 15:40     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #8
Цитата Сообщение от daslex Посмотреть сообщение
VLK, этот ваш ответ не ответ. Глупо-не глупо. В любом случае в памяти запоминается значение и независимо от того, что я делаю внутри цикла с этим значением, цикл будет выполнен столько раз, сколько он считал итераций при первом к нему обращении.
На самом деле в этом и кроется основная суть ответа - ЯП создаются явно не для функций типа int myfunc() { return 99; } и разработчики ЯП и компиляторов наверное ни когда не задумывались что кому то в голову придет мысль сделать подобную функцию, по этому функция каждый круг цикла вызывается по новой и возвращает новое значение, а не ссылку или что то там еще, т.к. функция по логике может \ должна возвращать разные (динамические) значения.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,665
05.09.2013, 15:42  [ТС]     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #9

Не по теме:

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


Не по теме:

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



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

Не по теме:

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

Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,056
Завершенные тесты: 1
05.09.2013, 15:45     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #10
Цитата Сообщение от daslex Посмотреть сообщение
Raali, если бы я умел читать то, что показывает дизасемблрный вид, если бы...
можете прислать сюда, если, конечно ваш Ide поддерживает генерацию asm, в студии точно можно, только удалите все лишние вещи из кода
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
05.09.2013, 16:24     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #11
У меня gcc подставляет 99, начиная с -O2.

Добавлено через 4 минуты
И это без лишних советов, а можно ведь ещё constexpr добавить или __attribute__ ((pure)).
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,665
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
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
05.09.2013, 21:20     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #13
Цитата Сообщение от daslex Посмотреть сообщение
Показывает, что на каждой итерации цикла выполняется функция, а не берется сохраненное значение.
Так в этом и суть, что если добавляешь туда вывод строки, то приходится выполнять эту функцию на каждой итерации ради вывода этой строки. Если вывод уберёшь, то константа подставляется прямо в цикл, а функция вообще не вызывается. Но в таком случае надо смотреть скомпилированный код.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,665
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). Функция вызывается каждый раз.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2013, 21:33     Оптимизирует ли компилятор код при использовании функции, возвращающей константу?
Еще ссылки по теме:
Ошибка при использовании дружественной функции C++
Шаблон функции, возвращающей количество отрицательных элементов массива C++
C++ Ошибка при использовании vector в заголовке функции
C++ CodeBlocks ругается при использовании функции copy()
C++ Напишите определение функции, возвращающей наименьшее из двух целых чисел

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,735
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). Функция вызывается каждый раз.
правильно Дебиг режим, оптимизатор не вступил в работу
только дизасемблирование поможет разгадать задачку
Yandex
Объявления
05.09.2013, 21:33     Оптимизирует ли компилятор код при использовании функции, возвращающей константу?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru