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

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

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

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

05.09.2013, 14:51. Просмотров 1136. Ответов 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++ Ошибка при использовании функции-члена
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
05.09.2013, 21:38     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #16
Так это потому что без оптимизации. Code::Blocks? Правой кнопкой на проекте -> Build options -> Compiler Flags -> Optimize even more (for speed) [-O2]. Тогда в этом примере даже цикла не будет, потому что его результат нигде не используется.

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

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

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

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

Добавлено через 2 минуты
Цитата Сообщение от daslex Посмотреть сообщение
а как это по-русски звучит. Хотя приблизительно.
"Оптимизация по скорости" оптимизирует код для более быстрого выполнения,размер может увеличится, может например цикл развернуть
есть еще "Оптимизация по размеру"
есть и другие
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,665
05.09.2013, 22:00  [ТС]     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #19
Ясно. спасибо. Может подскажете еще как в CodeBlocks дизасемблировать проект. А-то я даже просто посмотреть его не могу в таком дизасемблированном виде.
ValeryS
Модератор
6552 / 5018 / 463
Регистрация: 14.02.2011
Сообщений: 16,743
05.09.2013, 22:20     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #20
Цитата Сообщение от daslex Посмотреть сообщение
Может подскажете еще как в CodeBlocks дизасемблировать проект.
не могу сказать
Но есть сторонние дизасемблеры, например IDA, любой код дизасемблируют
есть отладчики, например самый популярный сейчас OllyDbg (олька)
но учти что работают они с бинарным кодом, ты увидишь ассемблерные инструкции
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
05.09.2013, 22:30     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #21
Цитата Сообщение от daslex Посмотреть сообщение
Может подскажете еще как в CodeBlocks дизасемблировать проект.
Debug -> Debugging windows -> Disassembly

Добавлено через 1 минуту
Это при отладке. А так можно gcc из командной строки
Код
g++ -S -fverbose-asm -g -masm=intel main.cpp
as -alhnd -mmnemonic=intel -msyntax=intel main.s >main.lst
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
05.09.2013, 22:40     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #22
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <stdio.h>
using namespace std;
 
 
 
int myfunc()
{
    return 99;
}
 
int main()
{
  printf ("%x\n", myfunc);
  getchar ();
  
  for (int i=0;i!=myfunc();i++)  std::cout<<i<<"  ";
    
    return 0;
}
Оптимизируем, запускаем, приаттачиваемся OllyDbg, брякаемся на функцию myfunc, и наблюдаем, что бряки не срабатывают. Прикольная однако, оптимизация. Тело функции есть, а вызова функции нет. Ну, дело их.
ValeryS
Модератор
6552 / 5018 / 463
Регистрация: 14.02.2011
Сообщений: 16,743
05.09.2013, 22:46     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #23
Цитата Сообщение от kravam Посмотреть сообщение
Оптимизируем, запускаем, приаттачиваемся OllyDbg, брякаемся на функцию myfunc, и наблюдаем, что бряки не срабатывают. Прикольная однако, оптимизация. Тело функции есть, а вызова функции нет. Ну, дело их.
так тело и будет, ты же его(адрес) на экран выводишь
Цитата Сообщение от kravam Посмотреть сообщение
printf ("%x\n", myfunc);
попробуй выбросить эту строчку, может и тела не будет
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
05.09.2013, 22:59     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #24
Цитата Сообщение от ValeryS Посмотреть сообщение
попробуй выбросить эту строчку, может и тела не будет
Очень может быть. А как это узнать наверное? Оптимизирующий вариант функции занимает две ассемблерные инструкции:

mov eax, 63
retn

И они даже фигурной скобкой не выделены в OllyDbg. Попробуй, найди такую функцию в отладчике, даже если она есть...
ValeryS
Модератор
6552 / 5018 / 463
Регистрация: 14.02.2011
Сообщений: 16,743
05.09.2013, 23:01     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #25
Цитата Сообщение от kravam Посмотреть сообщение
Попробуй, найди такую функцию в отладчике, даже если она есть...
ну что я могу сказать?
никак
проверяй все ret
но я думаю оно тебе не надо
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,056
Завершенные тесты: 1
06.09.2013, 13:51     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #26
Цитата Сообщение от kravam Посмотреть сообщение
Попробуй, найди такую функцию в отладчике, даже если она есть...
можно попробовать найти конкретно число 99
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
06.09.2013, 21:51     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #27
Цитата Сообщение от Raali Посмотреть сообщение
можно попробовать найти конкретно число 99
Внимание! Даже если мы найдём такие две инструкции:

mov eax, 63
retn

Мы не сможем сказать, что это такое ЕСЛИ К НИМ НЕ БУДЕТ ОБРАЩЕНИЯ. А к ним нет обращения при должном уровне оптимизации. Поэтому то ли это наша функция myfunc, то ли ещё какая херь- непонятно.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,665
07.09.2013, 00:59  [ТС]     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #28

Не по теме:

А какой "негодяй" тему переименовал? чуть-чуть неправильно получилось.
Мне не только при возврате из функции константы интересно было, но и при вычислении внутри функции чего-то, тоже (когда тему сохдавал).

т.е.


C++
1
2
3
4
5
6
7
8
9
10
11
12
int myfunc(int a)
{
    return a*a;
}
 
int main()
{
  int a=5;
  for (i=0;i!=myfunc(a);i++)  std::cout<<i<<"  ";
    
    return 0;
}

Не по теме:

хотя константой интереснее.

ValeryS
Модератор
6552 / 5018 / 463
Регистрация: 14.02.2011
Сообщений: 16,743
07.09.2013, 08:58     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #29
Цитата Сообщение от kravam Посмотреть сообщение
Очень может быть. А как это узнать наверное?
ну могу предложить такой вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <stdio.h>
using namespace std;
int myfuncStart()
{
 return 0;
}
int myfunc99()
{
 return 99;
}
int myfuncEnd()
{
 return 0;
}
 
int main()
{
 printf ("%x\n", myfuncStart);
 printf ("%x\n", myfuncEnd);
 
 printf ("%x\n", myfunc99);
 getchar ();
 for (int i=0;i!=myfunc();i++)  std::cout<<i<<"  ";
  return 0;
}
myfunc99 ляжет в коде между myfuncStart и myfuncEnd
сначала компилить с printf ("%x\n", myfunc99); потом без
и увидеть разницу(если есть)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2013, 12:20     Оптимизирует ли компилятор код при использовании функции, возвращающей константу?
Еще ссылки по теме:
Ошибка при использовании дружественной функции C++
Шаблон функции, возвращающей количество отрицательных элементов массива C++
C++ Ошибка при использовании vector в заголовке функции
C++ CodeBlocks ругается при использовании функции copy()
C++ Напишите определение функции, возвращающей наименьшее из двух целых чисел

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

Или воспользуйтесь поиском по форуму:
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
07.09.2013, 12:20     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #30
Цитата Сообщение от daslex Посмотреть сообщение
но и при вычислении внутри функции чего-то, тоже (когда тему сохдавал).
Да, эта оптимизация называется "протяжка констант".
Yandex
Объявления
07.09.2013, 12:20     Оптимизирует ли компилятор код при использовании функции, возвращающей константу?
Ответ Создать тему
Опции темы

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