|
Оптимизация встраивания функций, для чистых функций |
|
|
|
Dec 21 2010, 07:43
|
Местный
  
Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123

|
Доброго всем времени суток.
Имеется чистая функция - принимает один целочисленный параметр и возвращает результат, который зависит только от этого параметра. Никаких побочных эффектов - казалось-бы идеальный кандидат для встраивания. В большинстве случаев в эту функцию передаются константные параметры и редко переменные. Хочется, чтобы при передаче константного параметра, функция встраивалась и выполнялась константная подстановка (вызов функции заменялся вычисленным во время компиляции значением), а при передачи переменной происходил честный вызов функции. Компиляторы семейства GCC именно так и делают. Компиляторы IAR ведут себя по другому: если функция вызывается с константными параметрами больше определённого порогового числа раз, то компилятор генерирует тело этой функции и перестаёт её встраивать везде, даже где это выгодно. #pragma inline=forced помогает не сильно, так как функция встраивается всегда, в том числе при переменных аргументах, когда это не выгодно. Иными словами, функция или всегда встраивается, или всегда вызывается. GCC, как я уже говорил принимает решение о встраивании функции для каждого ее упоминаия в исходном тексте.
Кто-нибудь знает как добиться желаемого поведения от компиляторов IAR?
Всё описанное справедливо, вероятно, для всех компиляторов семейства IAR. По крайней мере, для платформ ARM, AVR & MSP430.
|
|
|
|
|
 |
Ответов
|
Dec 21 2010, 08:48
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(MrYuran @ Dec 21 2010, 14:20)  То есть, вы хотите, чтобы одна и та же функция либо встраивалась, либо нет в зависимости от контекста? А почему бы и нет? Цитата(Xenia @ Dec 21 2010, 14:33)  Это не поможет. Компилятор не обязан вычислять значения функций. Например, даже если вы запишите sin(0.5), то не ожидайте, что компилятор станет вычислять синус в момент компилляции. Функция, он функция и есть. Это можно ожидать. Многие компиляторы так давненько поступают. Это из оперы: http://en.wikipedia.org/wiki/Constant_folding
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
Сообщений в этой теме
neiver Оптимизация встраивания функций Dec 21 2010, 07:43 vmp А если функцию описать как static, чтобы компилято... Dec 21 2010, 08:17 Xenia Цитата(vmp @ Dec 21 2010, 14:17) А если ф... Dec 21 2010, 08:33  Xenia Цитата(demiurg_spb @ Dec 21 2010, 14:48) ... Dec 21 2010, 08:57   jorikdima Цитата(Xenia @ Dec 21 2010, 14:57) А не ф... Jan 11 2011, 05:41 neiver Цитата(Xenia @ Dec 21 2010, 14:33) А если... Dec 21 2010, 09:06 Сергей Борщ QUOTE (neiver @ Dec 21 2010, 14:06) Разли... Dec 21 2010, 11:37  Dog Pawlowa Цитата(Сергей Борщ @ Dec 21 2010, 17:37) ... Dec 21 2010, 17:23 sergeeff Я как-то писал с цитатами из какой-то книги, кажет... Dec 21 2010, 18:04 scifi Цитата(sergeeff @ Dec 22 2010, 00:04) Я к... Dec 21 2010, 18:56  Dog Pawlowa Цитата(scifi @ Dec 22 2010, 00:56) зачем ... Dec 22 2010, 00:21 neiver Я решил не полагаться на "умность" компи... Jan 11 2011, 07:25
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|