Влияние атрибутов GCC на вложенные функции

Атрибуты функций могут быть указаны только для объявления функций (не определения). Поэтому я не могу указать атрибуты для вложенной функции. Например:

//invalid line. hot_nested_function is invisible outside "some_function"
void hot_nested_function() __attribute__ ((hot));

//valid attribute for declaration
int some_function() __attribute__ ((hot));

int some_function(){
    void hot_nested_function(){
         //time critical code
    }
    for( int i=0; i<REPEAT_MANY_TIMES;i++)
        hot_nested_function();
}

В таком случае, будет ли hot_nested_function оптимизирована как hot?

UPD: на тупом примере gcc (означает gcc -O1 и более высокий уровень оптимизации) заменяет вызовы функций своим телом, как с, так и без __attribute__ ((hot)) (для вложенной функции). Даже ничего не напоминает о вложенной функции.

UPD2: Согласно gcc.git / gcc / tree-nested.c, он разрешает ссылки на родительские функции, внешние переходы меток и так далее. На следующем этапе вложенные функции преобразуются в независимые функции со встроенной способностью. Но все еще неясно об атрибутах родительской функции. Они обращались к вложенным?

1 ответ

int some_function(){
    void __attribute__ ((hot)) hot_nested_function(){
         //time critical code
    }
    for( int i=0; i<REPEAT_MANY_TIMES;i++)
        hot_nested_function();
}

Синтаксис атрибута функции gcc является одним из

__attribute__ ((...)) returntype functionname(...)
returntype __attribute__ ((...)) functionname(...)
returntype functionname(...) __attribute__ ((...))

и последний может быть использован только в прототипе, но не первые два.

Другой способ

int some_function(){
    auto void hot_nested_function() __attribute__ ((hot));

    void hot_nested_function(){
         //time critical code
    }

    for( int i=0; i<REPEAT_MANY_TIMES;i++)
        hot_nested_function();
}

Что касается атрибутов, которые будут автоматически применяться ко всем содержащим объектам - я не знаю, и документация ничего не говорит об этом, так что это должен решать компилятор. Лучше указывать вручную - поведение может меняться в зависимости от версии компилятора.

Другие вопросы по тегам