Влияние атрибутов 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();
}
Что касается атрибутов, которые будут автоматически применяться ко всем содержащим объектам - я не знаю, и документация ничего не говорит об этом, так что это должен решать компилятор. Лучше указывать вручную - поведение может меняться в зависимости от версии компилятора.