Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
1

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

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

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

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

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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.09.2013, 14:51
Ответы с готовыми решениями:

Оптимизирует ли компилятор деление/умножение double?
Если я пишу double d = ...; for( ...; ...; d *= 2 ) ... или for( ...; ...; d /= 2 ) ...

Оптимизирует ли компилятор временные переменные?
Здравствуйте, способен ли компилятор преобразовать это var temp = one + two; return temp; в...

Оптимизирует ли компилятор подобные вещи?
Здравствуйте, я пишу небольшую библиотеку для личных целей и просто для интереса. Дело в том, что...

[РЕШЕНО] Компилятор оптимизирует элемент структуры Text
Использую MicroMenu. Когда-то я только начинал работать в IAR, переделал MicroMenu, обращался к...

33
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
05.09.2013, 22:30 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от 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
2
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
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, и наблюдаем, что бряки не срабатывают. Прикольная однако, оптимизация. Тело функции есть, а вызова функции нет. Ну, дело их.
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
05.09.2013, 22:46 23
Цитата Сообщение от kravam Посмотреть сообщение
Оптимизируем, запускаем, приаттачиваемся OllyDbg, брякаемся на функцию myfunc, и наблюдаем, что бряки не срабатывают. Прикольная однако, оптимизация. Тело функции есть, а вызова функции нет. Ну, дело их.
так тело и будет, ты же его(адрес) на экран выводишь
Цитата Сообщение от kravam Посмотреть сообщение
printf ("%x\n", myfunc);
попробуй выбросить эту строчку, может и тела не будет
1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
05.09.2013, 22:59 24
Цитата Сообщение от ValeryS Посмотреть сообщение
попробуй выбросить эту строчку, может и тела не будет
Очень может быть. А как это узнать наверное? Оптимизирующий вариант функции занимает две ассемблерные инструкции:

mov eax, 63
retn

И они даже фигурной скобкой не выделены в OllyDbg. Попробуй, найди такую функцию в отладчике, даже если она есть...
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
05.09.2013, 23:01 25
Цитата Сообщение от kravam Посмотреть сообщение
Попробуй, найди такую функцию в отладчике, даже если она есть...
ну что я могу сказать?
никак
проверяй все ret
но я думаю оно тебе не надо
1
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
06.09.2013, 13:51 26
Цитата Сообщение от kravam Посмотреть сообщение
Попробуй, найди такую функцию в отладчике, даже если она есть...
можно попробовать найти конкретно число 99
1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
06.09.2013, 21:51 27
Цитата Сообщение от Raali Посмотреть сообщение
можно попробовать найти конкретно число 99
Внимание! Даже если мы найдём такие две инструкции:

mov eax, 63
retn

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

Не по теме:

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

т.е.


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;
}

Не по теме:

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

0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
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); потом без
и увидеть разницу(если есть)
1
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
07.09.2013, 12:20 30
Цитата Сообщение от daslex Посмотреть сообщение
но и при вычислении внутри функции чего-то, тоже (когда тему сохдавал).
Да, эта оптимизация называется "протяжка констант".
1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
07.09.2013, 23:50 31
Цитата Сообщение от ValeryS Посмотреть сообщение
ну могу предложить такой вариант
условимся, что он надёжен. В общем, при наилучшей оптимизации (gcc) при НЕПЕЧАТАНИИ адреса функции тело функции не создаётся
При отсутствии какой-либо оптимизации + при отсутствии неиспользовании функции+ при непечатании адреса тело функции создаётся
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
08.09.2013, 00:27 32
Цитата Сообщение от kravam Посмотреть сообщение
условимся, что он надёжен.
не могу гарантировать, но выведено эмпирическим путем, функции лежат в коде в порядке их объявления
этим часто пользуются при шифровке функций берут адрес функции, адрес следующей вычитают и получают размер шифруемой функции
Цитата Сообщение от kravam Посмотреть сообщение
при наилучшей оптимизации (gcc) при НЕПЕЧАТАНИИ адреса функции тело функции не создаётся
что и требовалось доказать, не используется нафиг не нужна
Цитата Сообщение от kravam Посмотреть сообщение
При отсутствии какой-либо оптимизации
тоже легко объяснимо, компилятор честно все обработал оптимизатор даже не приступал
Но вот нужны ли эти знания,так сказать, в практической жизни?
достаточно написать inline и все
хотя тоже не факт что компилятор послушается, раньше не инлайнил функции с циклами, теперь говорят исправился
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
08.09.2013, 00:45 33
Цитата Сообщение от ValeryS Посмотреть сообщение
не могу гарантировать, но выведено эмпирическим путем, функции лежат в коде в порядке их объявления
Если они более-менее маленькие, логично расположены, нет отчётов профайлера и линкер тупой, то да. Иначе их могут немного перетасовать, чтобы в кеше поближе друг к другу были.

Цитата Сообщение от ValeryS Посмотреть сообщение
этим часто пользуются при шифровке функций берут адрес функции, адрес следующей вычитают и получают размер шифруемой функции
Строго говоря, каст указателя на функцию к обычному указателю — это undefined behavior.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
08.09.2013, 00:54 34
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Иначе их могут немного перетасовать, чтобы в кеше поближе друг к другу были.
никогда такого не видел, а уж дизасемблировал не мало
да и нахрена их в кеше поближе держать?какая вероятность что друг за другом выполняются
хотя возможно, работа компилятора тайна великая есть
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Строго говоря, каст указателя на функцию к обычному указателю — это undefined behavior.
строго говоря да
но это строго говоря, а шифрование исполняемого кода это уже хакерские методы, а там другие подходы
0
08.09.2013, 00:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.09.2013, 00:54
Помогаю со студенческими работами здесь

Есть объект типа T, но если вместо него подставить вызов функции, возвращающей T, код не компилится, почему?
Есть объект типа vector&lt;int&gt;, но если вместо него подставить вызов функции, возвращающей...

Компилятор выдает ошибку при использовании фабричного метода
Всем привет!!! новая ошибка... смотрите, теперь у меня есть класс template &lt;typename T&gt; ...

Оптимизирует ли компилятор выражения в цикле типа 90*M_PI или каждую итерацию в цикле считает заново?
Занялся сабжем по проекту. IDE Builder 2010 1) Оптимизирует ли компилятор выражения в цикле типа...

Почему компилятор ругается на то, что класс не объявлен при использовании оператора если?
......... if (i &lt; 3) { int b, c; cin &gt;&gt; b &gt;&gt; c; date myDate(a,...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru