【发布时间】:2014-03-12 10:14:11
【问题描述】:
只能为函数声明(而不是定义)指定函数属性。 所以,我不能为嵌套函数指定属性。 例如:
//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,解析父函数引用、外部标签跳转等。在下一阶段,嵌套函数将转换为具有内联能力的独立函数。但目前还不清楚父函数的属性。他们申请嵌套了吗?
【问题讨论】:
-
你真的试过了吗?它似乎对我有用。您使用的是什么版本的 gcc 以及哪些命令行开关?
-
@PaulR
gcc version 4.8.1 20130909 [gcc-4_8-branch revision 202388]编译为:gcc -std=gnu99 -O2 file.c -
当然可以编译——它是正确的 C 代码(但逻辑上不正确——hot_nested_function 声明为全局,而不是嵌套)。
-
嵌套函数在 C 中已被弃用,已经有一段时间了。如果发现支持处于某种比特腐烂状态,我不会太惊讶。
-
我认为您的 gcc 命令行中缺少
-fnested-functions。
标签: c gcc compiler-construction c99 function-attributes