реклама на сайте
подробности

 
 
> Оптимизация встраивания функций, для чистых функций
neiver
сообщение Dec 21 2010, 07:43
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Доброго всем времени суток.

Имеется чистая функция - принимает один целочисленный параметр и возвращает результат, который зависит только от этого параметра. Никаких побочных эффектов - казалось-бы идеальный кандидат для встраивания. В большинстве случаев в эту функцию передаются константные параметры и редко переменные. Хочется, чтобы при передаче константного параметра, функция встраивалась и выполнялась константная подстановка (вызов функции заменялся вычисленным во время компиляции значением), а при передачи переменной происходил честный вызов функции. Компиляторы семейства GCC именно так и делают. Компиляторы IAR ведут себя по другому: если функция вызывается с константными параметрами больше определённого порогового числа раз, то компилятор генерирует тело этой функции и перестаёт её встраивать везде, даже где это выгодно. #pragma inline=forced помогает не сильно, так как функция встраивается всегда, в том числе при переменных аргументах, когда это не выгодно. Иными словами, функция или всегда встраивается, или всегда вызывается. GCC, как я уже говорил принимает решение о встраивании функции для каждого ее упоминаия в исходном тексте.

Кто-нибудь знает как добиться желаемого поведения от компиляторов IAR?

Всё описанное справедливо, вероятно, для всех компиляторов семейства IAR. По крайней мере, для платформ ARM, AVR & MSP430.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
neiver
сообщение Dec 21 2010, 09:06
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Цитата(Xenia @ Dec 21 2010, 14:33) *
А если вам нужно, чтобы тело функции вычислялось в момент компиляции, тогда используйте не функцию, а дефайн. Например так:

#define func(x) 2*(x)*(x)+4*(x)-6

тогда это действительно будет всегда прямая подстановка, и если x окажется константой, то компилятор вычислит всё выражение func во время компиляции.

Нет, дефайн даст тот-же результат, что и функция + #pragma inline=forced. Только функция в данном случае всё равно лучше.

Цитата(Xenia @ Dec 21 2010, 14:57) *
А не факт, что IAR того же не умеет. Многое зависит от установок оптимизации, тогда как топикстартер молчит об этих установках, как рыб sm.gif.

Различные установки оптимизации не дают желаемого результата - функция либо всегда встраивается, либо всегда нет, не зависимо от контекста её вызова.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 21:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01366 секунд с 7
ELECTRONIX ©2004-2016