1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
||||||
1 | ||||||
Оптимизирует ли компилятор код при использовании функции, возвращающей константу?05.09.2013, 14:51. Показов 2208. Ответов 33
Метки нет (Все метки)
Объясните мне компиляторы С++ оптимизируют такой код?. Да и вообще компиляторы оптимизуруют это?
Я просто думал, что сохраняется адрес памяти, а оттуда цикл вытаскивает то, что там по адресу лежит, т.е. я мыслил так: "в примере на адрес кладется адрес функции, значит в конце каждой итерации эта функция будет выполняться. "
0
|
05.09.2013, 14:51 | |
Ответы с готовыми решениями:
33
Оптимизирует ли компилятор деление/умножение double? Оптимизирует ли компилятор временные переменные? Оптимизирует ли компилятор подобные вещи? [РЕШЕНО] Компилятор оптимизирует элемент структуры Text |
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
|
|
05.09.2013, 22:30 | 21 |
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 | |||||
1
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
05.09.2013, 22:59 | 24 |
Очень может быть. А как это узнать наверное? Оптимизирующий вариант функции занимает две ассемблерные инструкции:
mov eax, 63 retn И они даже фигурной скобкой не выделены в OllyDbg. Попробуй, найди такую функцию в отладчике, даже если она есть...
1
|
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
|
|
06.09.2013, 13:51 | 26 |
1
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
06.09.2013, 21:51 | 27 |
Внимание! Даже если мы найдём такие две инструкции:
mov eax, 63 retn Мы не сможем сказать, что это такое ЕСЛИ К НИМ НЕ БУДЕТ ОБРАЩЕНИЯ. А к ним нет обращения при должном уровне оптимизации. Поэтому то ли это наша функция myfunc, то ли ещё какая херь- непонятно.
1
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
||||||
07.09.2013, 00:59 [ТС] | 28 | |||||
Не по теме: А какой "негодяй" тему переименовал? :scratch: чуть-чуть неправильно получилось.
Не по теме: хотя константой интереснее.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
|
||||||
07.09.2013, 08:58 | 29 | |||||
ну могу предложить такой вариант
сначала компилить с printf ("%x\n", myfunc99); потом без и увидеть разницу(если есть)
1
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
07.09.2013, 23:50 | 31 |
условимся, что он надёжен. В общем, при наилучшей оптимизации (gcc) при НЕПЕЧАТАНИИ адреса функции тело функции не создаётся
При отсутствии какой-либо оптимизации + при отсутствии неиспользовании функции+ при непечатании адреса тело функции создаётся
1
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
|
|
08.09.2013, 00:27 | 32 |
не могу гарантировать, но выведено эмпирическим путем, функции лежат в коде в порядке их объявления
этим часто пользуются при шифровке функций берут адрес функции, адрес следующей вычитают и получают размер шифруемой функции что и требовалось доказать, не используется нафиг не нужна тоже легко объяснимо, компилятор честно все обработал оптимизатор даже не приступал Но вот нужны ли эти знания,так сказать, в практической жизни? достаточно написать inline и все хотя тоже не факт что компилятор послушается, раньше не инлайнил функции с циклами, теперь говорят исправился
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
08.09.2013, 00:45 | 33 |
Если они более-менее маленькие, логично расположены, нет отчётов профайлера и линкер тупой, то да. Иначе их могут немного перетасовать, чтобы в кеше поближе друг к другу были.
Строго говоря, каст указателя на функцию к обычному указателю — это undefined behavior.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
|
|
08.09.2013, 00:54 | 34 |
никогда такого не видел, а уж дизасемблировал не мало
да и нахрена их в кеше поближе держать?какая вероятность что друг за другом выполняются хотя возможно, работа компилятора тайна великая есть строго говоря да но это строго говоря, а шифрование исполняемого кода это уже хакерские методы, а там другие подходы
0
|
08.09.2013, 00:54 | |
08.09.2013, 00:54 | |
Помогаю со студенческими работами здесь
34
Есть объект типа T, но если вместо него подставить вызов функции, возвращающей T, код не компилится, почему? Компилятор выдает ошибку при использовании фабричного метода Оптимизирует ли компилятор выражения в цикле типа 90*M_PI или каждую итерацию в цикле считает заново? Почему компилятор ругается на то, что класс не объявлен при использовании оператора если? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |