Компиляторы C / C ++ оптимизируют однослойные функции с постоянными параметрами (известными во время компиляции) только при использовании -Os, -O1 и -O2.Они не оптимизируют все слои.Только -O3 может сделать это.gcc - это WinAVR 4.3.3, который не поддерживает атрибут «optimize».
void inner(double value)
{
//operations using value
//...
}
void outer(double value)
{
//few operations using value
//...
inner(value);
}
int main()
{
inner(1); //optimize
outer(1); //only optimize by using -O3
}
Каковы возможные решения, кроме следующих?
- -O3 удерживать программу или файл (неправильное использование увеличит размер)
- атрибут optimize -O3 для функций (4.3.3 не поддерживает)
- макрос (подвержен ошибкам)
Обновление:
//inner function
static inline void _delay_us(double __us) __attribute__((always_inline));
//outer function
void f(double);
inline f1(double);
static inline f2(double);
static f3(double);
f1 оптимизирован, но выдает предупреждение '_delay_us' является статическим, но используется во встроенной функции 'f1', которая не является статической из-за проблемы статической функции.Другие не оптимизированы.
Решение:
static inline void outer(double) __attribute__((always_inline));
Встроенный ключ.Моя внешняя функция слишком велика для inline.Атрибут always_inline заставляет функцию быть встроенной.Это позволяет компилятору оптимизировать функцию с меньшими затратами на компиляцию, чем пытаться выяснить оптимизацию.-O3 достаточно умен, чтобы выполнить оптимизацию, но не -Os.-О, возможно, понадобятся некоторые параметры компилятора.(Ключевое слово static требуется, потому что внутренняя функция также является статической inline.)