Форум программистов, компьютерный форум 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++ Ошибка при использовании функции-члена
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 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
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
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
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
05.09.2013, 22:46     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #23
Цитата Сообщение от kravam Посмотреть сообщение
Оптимизируем, запускаем, приаттачиваемся OllyDbg, брякаемся на функцию myfunc, и наблюдаем, что бряки не срабатывают. Прикольная однако, оптимизация. Тело функции есть, а вызова функции нет. Ну, дело их.
так тело и будет, ты же его(адрес) на экран выводишь
Цитата Сообщение от kravam Посмотреть сообщение
printf ("%x\n", myfunc);
попробуй выбросить эту строчку, может и тела не будет
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
05.09.2013, 22:59     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #24
Цитата Сообщение от ValeryS Посмотреть сообщение
попробуй выбросить эту строчку, может и тела не будет
Очень может быть. А как это узнать наверное? Оптимизирующий вариант функции занимает две ассемблерные инструкции:

mov eax, 63
retn

И они даже фигурной скобкой не выделены в OllyDbg. Попробуй, найди такую функцию в отладчике, даже если она есть...
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
05.09.2013, 23:01     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #25
Цитата Сообщение от kravam Посмотреть сообщение
Попробуй, найди такую функцию в отладчике, даже если она есть...
ну что я могу сказать?
никак
проверяй все ret
но я думаю оно тебе не надо
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
06.09.2013, 13:51     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #26
Цитата Сообщение от kravam Посмотреть сообщение
Попробуй, найди такую функцию в отладчике, даже если она есть...
можно попробовать найти конкретно число 99
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
06.09.2013, 21:51     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #27
Цитата Сообщение от Raali Посмотреть сообщение
можно попробовать найти конкретно число 99
Внимание! Даже если мы найдём такие две инструкции:

mov eax, 63
retn

Мы не сможем сказать, что это такое ЕСЛИ К НИМ НЕ БУДЕТ ОБРАЩЕНИЯ. А к ним нет обращения при должном уровне оптимизации. Поэтому то ли это наша функция myfunc, то ли ещё какая херь- непонятно.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
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
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
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); потом без
и увидеть разницу(если есть)
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
07.09.2013, 12:20     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #30
Цитата Сообщение от daslex Посмотреть сообщение
но и при вычислении внутри функции чего-то, тоже (когда тему сохдавал).
Да, эта оптимизация называется "протяжка констант".
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
07.09.2013, 23:50     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #31
Цитата Сообщение от ValeryS Посмотреть сообщение
ну могу предложить такой вариант
условимся, что он надёжен. В общем, при наилучшей оптимизации (gcc) при НЕПЕЧАТАНИИ адреса функции тело функции не создаётся
При отсутствии какой-либо оптимизации + при отсутствии неиспользовании функции+ при непечатании адреса тело функции создаётся
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
08.09.2013, 00:27     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #32
Цитата Сообщение от kravam Посмотреть сообщение
условимся, что он надёжен.
не могу гарантировать, но выведено эмпирическим путем, функции лежат в коде в порядке их объявления
этим часто пользуются при шифровке функций берут адрес функции, адрес следующей вычитают и получают размер шифруемой функции
Цитата Сообщение от kravam Посмотреть сообщение
при наилучшей оптимизации (gcc) при НЕПЕЧАТАНИИ адреса функции тело функции не создаётся
что и требовалось доказать, не используется нафиг не нужна
Цитата Сообщение от kravam Посмотреть сообщение
При отсутствии какой-либо оптимизации
тоже легко объяснимо, компилятор честно все обработал оптимизатор даже не приступал
Но вот нужны ли эти знания,так сказать, в практической жизни?
достаточно написать inline и все
хотя тоже не факт что компилятор послушается, раньше не инлайнил функции с циклами, теперь говорят исправился
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.09.2013, 00:45     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #33
Цитата Сообщение от ValeryS Посмотреть сообщение
не могу гарантировать, но выведено эмпирическим путем, функции лежат в коде в порядке их объявления
Если они более-менее маленькие, логично расположены, нет отчётов профайлера и линкер тупой, то да. Иначе их могут немного перетасовать, чтобы в кеше поближе друг к другу были.

Цитата Сообщение от ValeryS Посмотреть сообщение
этим часто пользуются при шифровке функций берут адрес функции, адрес следующей вычитают и получают размер шифруемой функции
Строго говоря, каст указателя на функцию к обычному указателю — это undefined behavior.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2013, 00:54     Оптимизирует ли компилятор код при использовании функции, возвращающей константу?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
08.09.2013, 00:54     Оптимизирует ли компилятор код при использовании функции, возвращающей константу? #34
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Иначе их могут немного перетасовать, чтобы в кеше поближе друг к другу были.
никогда такого не видел, а уж дизасемблировал не мало
да и нахрена их в кеше поближе держать?какая вероятность что друг за другом выполняются
хотя возможно, работа компилятора тайна великая есть
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Строго говоря, каст указателя на функцию к обычному указателю — это undefined behavior.
строго говоря да
но это строго говоря, а шифрование исполняемого кода это уже хакерские методы, а там другие подходы
Yandex
Объявления
08.09.2013, 00:54     Оптимизирует ли компилятор код при использовании функции, возвращающей константу?
Ответ Создать тему
Опции темы

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